Как работает такая проверка на четность/нечетность?

170
13 января 2019, 10:00

Встретил пример, проверка числа i на нечетность и никак не могу понять как работает данная проверка. Конкретно не понятен блок (i&1).

if ((i&1)!=1)
Answer 1

Выражение i & 1 выполняет побитовую операцию "И" между соответствующими битами обоих чисел. Как это работает? Представте оба числа i и 1 в двоичной записи. Например, если число i равно 1234567891, то в двоичной записи из 32-х бит (размер типа int в Java), то есть из 4-х байт, оно будет выглядить вот так:

01001001 10010110 00000010 11010011

А число 1, в такой же записи, выглядит вот так:

00000000 00000000 00000000 00000001

Теперь запишем оба числа в этой записи друг под другом и выполним операцию "И" между каждым битов верхнего числа со стоящим под ним битом нижнего:

01001001 10010110 00000010 11010011
00000000 00000000 00000000 00000001

Операция "И" возвращает 1 только если оба бита равны 1. В противном случае она возвращает 0. В нашем случае лишь крайнии справа биты обоих чисел равны 1 одновременно. Таким образом результат будет

00000000 00000000 00000000 00000001

То есть 1.

В этом и только в этом случае наше первое число является нечётным. А если бы крайний правый бит первого числа был 0, то без разницы чему равны остальные биты первого числа, результат побитового "И" со вторым числом 1 всегда будет 0.

Почему этот бит является признаком нечётности? Тут можно прочитать длинную лекцию о позиционных системах счисления, но если в кратце, то двоичная запись числа это сумма произведений цифр числа на два в степени индекса цифры начиная справа, когда первый индекс - это ноль. Например двоичное число 10111 - это справа налево: (1 * 2^0) + (1 * 2^1) + (1 * 2^2) + (0 * 2^3) + (1 * 2^4) = 1 + 2 + 4 + 0 + 16 = 23. Обратите внимание на то, что значение лишь крайне правой цифры может быть нечётным. Сумма любых чётных чисел всегда даёт чётное число. Сумма любого чётного числа и нечётного числа (например единицы) всегда даёт нечётное число. Именно поэтому мы проверяем лишь крайний правый бит когда хотим узнать чётное число или нет.

Этот способ работает и с отрицательными числами. Для представления отрицательных чисел в двоичной системе счисления есть несколько способов. В большинстве компьютеров, в том числе и в JVM (виртуальной Java машине), используется способ, который называется дополнительный код. Суть способа очень проста: берём абсолютное значение числа, заменяем все единицы на нули и все нули на единицы и затем прибавляет единицу. Результат этих манипуляций будет иметь точно такой же младший (крайний правый) бит, что и абсолютное значение числа. А отрицательное число чётно тогда и только тогда, когда чётно его абсолютное значение. Например -18 чётно, потому что чётно 18. То есть младший бит любого целого числа в Java является признаком нечётности.

Answer 2

Это побитовое умножение, побитово умножив число на 1 получим последний(правый) бит.

READ ALSO
Android. Фрагменты накладываются друг на друга

Android. Фрагменты накладываются друг на друга

Конечно же, я почитал темы здесь и в гуглеИ не нашёл решения

141
Имена полей Pojo объекта

Имена полей Pojo объекта

Почему objectMapper не видит сеттеров полей Pojo объекта?

121
java Как правильно спрятать JPanel

java Как правильно спрятать JPanel

Хочу по нажатию Кнопки спрятать одну панель, что позволит увидеть другую У меня такой код

151