Объяснение новичка битовым операндам - PullRequest
0 голосов
/ 04 ноября 2018

Я в настоящее время беру уроки программирования Intro. Мы изучаем Java SE (в конечном итоге переходим к Java EE). У меня есть понимание большинства вещей, но я ударил стену с помощью побитовых манипуляций и маскировки. Например:

отредактировано здесь: Я хочу выяснить, делится ли число на 3 и 5, но не на 2. Единственное требование - я не могу использовать%, чтобы найти ответ, это должно быть в вызове метода, и я должен использовать маскирование и побитовые операнды.

Я уже научился определять, является ли число нечетным или четным с помощью этого:

public static boolean isEven(int num) {
        return ((num & 1) == 0);
    }

Я понимаю, что делают побитовые операнды (&, |, ^, >>, <<), но не могу реализовать их должным образом. Наша книга также не имеет информации об этом, это из заметок наших учителей. Я не прошу просто ответ, мне нужно понять, как он на самом деле работает. </p>

1 Ответ

0 голосов
/ 04 ноября 2018

Это довольно сложно, если только ваш профессор не показал вам, как делать подобные вещи. Я сделаю 3, а вы поймете, как сделать 5.

Это работает, потому что 4 == 1 мод 3 :

static boolean isDivisibleBy3(int n)
{
    while(n<0 || n>3) {
        n = (n&3) + (n>>2);
    }
    return (n==3 || n==0)
}

n&3 получает два младших бита. (n>>2) получает остальные биты и делит на 4. Потому что 4 == 1 мод 3 , деление на 4 не меняет оставшийся мод 3. Затем мы складываем их вместе и получаем меньший номер с тем же остатком, что и тот, с которого мы начали.

Повторяйте до тех пор, пока мы не получим число меньше 4. В этот момент оно не станет меньше.

Есть более быстрые способы сделать это, но этот способ проще всего понять.

...