Встретил пример, проверка числа i на нечетность и никак не могу понять как работает данная проверка. Конкретно не понятен блок (i&1).
if ((i&1)!=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 является признаком нечётности.
Это побитовое умножение, побитово умножив число на 1 получим последний(правый) бит.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Конечно же, я почитал темы здесь и в гуглеИ не нашёл решения
Хочу по нажатию Кнопки спрятать одну панель, что позволит увидеть другую У меня такой код