Что означает это логическое значение (число & 1) == 0 "?
В CodeReview Я опубликовал рабочий код и попросил совета для его улучшения. Один, который я получил, - использовать логический метод, чтобы проверить, имеет ли ArrayList четное количество индексов (что было необходимо). Это был код, который был предложен:
private static boolean isEven(int number)
{
return (number & 1) == 0;
}
Поскольку я уже приставал к этому конкретному пользователю для большой помощи, я решил, что время, когда я приставал к сообществу SO! Я действительно не понимаю, как это работает. Метод вызывается и принимает размер ArrayList в качестве параметра (то есть ArrayList имеет десять элементов, число = 10).
Я знаю, что в одном &
выполняется сравнение как числа, так и 1, но после этого я потерялся.
Как я его читаю, он говорит return true, если number == 0
и 1 == 0
. Я знаю, что первое не соответствует действительности, и последнее, очевидно, не имеет смысла. Может кто-нибудь помочь мне?
Изменить: я должен добавить, что код действительно работает, если кто-то задается вопросом.
Ответы
Ответ 1
Имейте в виду, что "&" является поразрядной работой. Вы, вероятно, знаете об этом, но это не совсем ясно для меня, основываясь на том, как вы задавали вопрос.
Таким образом, теоретическая идея состоит в том, что у вас есть некоторый int, который может быть выражен в битах некоторой серией из 1s и 0s. Например:
...10110110
В двоичном формате, потому что это база 2, всякий раз, когда побитовая версия номера заканчивается на 0, она четна, а когда она заканчивается на 1, она нечетна.
Следовательно, выполнение поразрядного и с 1 для выше:
...10110110 & ...00000001
Конечно, это 0, поэтому вы можете сказать, что исходный вход был четным.
В качестве альтернативы рассмотрим нечетное число. Например, добавьте 1 к тому, что у нас было выше. Тогда
...10110111 & ...00000001
Является равным 1 и, следовательно, не равно нулю. Вуаля.
Ответ 2
Вы можете определить число либо четным, либо нечетным по последнему биту в его двоичном представлении:
1 -> 00000000000000000000000000000001 (odd)
2 -> 00000000000000000000000000000010 (even)
3 -> 00000000000000000000000000000011 (odd)
4 -> 00000000000000000000000000000100 (even)
5 -> 00000000000000000000000000000101 (odd)
6 -> 00000000000000000000000000000110 (even)
7 -> 00000000000000000000000000000111 (odd)
8 -> 00000000000000000000000000001000 (even)
&
между двумя целыми числами является побитовым оператором AND:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Итак, если (number & 1) == 0
- true
, это означает, что number
четный.
Предположим, что number == 6
, тогда:
6 -> 00000000000000000000000000000110 (even)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 -> 00000000000000000000000000000001
-------------------------------------
0 -> 00000000000000000000000000000000
и когда number == 7
:
7 -> 00000000000000000000000000000111 (odd)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 -> 00000000000000000000000000000001
-------------------------------------
1 -> 00000000000000000000000000000001
Ответ 3
&
- побитовый оператор И. &&
является логическим оператором AND
В двоичном формате, если бит бит установлен (то есть один), число нечетно.
В двоичном формате, если бит цифр равен нулю, число равно.
(number & 1)
является поразрядным И-битом бит бит.
Другой способ сделать это (и, возможно, менее эффективный, но более понятный) - использовать оператор модуля %
:
private static boolean isEven(int number)
{
if (number < 0)
throw new ArgumentOutOfRangeException();
return (number % 2) == 0;
}
Ответ 4
Это выражение означает, что "целое число представляет четное число".
Вот почему: двоичное представление десятичного 1
равно 00000000001
. Все нечетные числа заканчиваются на 1
в двоичном формате (это легко проверить: предположим, что двоичное представление числа не заканчивается на 1
, а затем оно состоит из ненулевых степеней двух, что всегда является четным числом). Когда вы выполняете двоичный AND
с нечетным числом, результат 1
; когда вы выполняете двоичный AND
с четным числом, результат 0
.
Это был предпочтительный метод решения нечетных/четных в то время, когда оптимизаторы были плохими до несуществующих, а операторы %
требовали в два раза больше циклов, принимаемых оператором &
. В наши дни, если вы выполняете number % 2 == 0
, компилятор, скорее всего, сгенерирует код, который выполняется так же быстро, как (number & 1) == 0
.
Ответ 5
Единый &
означает бит-мудрый and
оператор не сравнение
Таким образом, этот код проверяет, установлен ли первый bit
(наименее значимый/самый правый), который указывает, является ли число odd
или нет; потому что все нечетные числа заканчиваются на 1
в наименее значимом бите, например. xxxxxxx1
Ответ 6
&
- побитовая операция AND
.
Для числа = 8:
1000
0001
& ----
0000
В результате (8 & 1) == 0
. Это относится ко всем четным числам, так как они кратные 2, а первая двоичная цифра справа всегда равна 0. 1 имеет двоичное значение 1 с ведущими 0, поэтому, когда мы AND
с четным числом, мы 'осталось с 0.
Ответ 7
Оператор &
в Java является побитовым и оператором. В принципе, (number & 1)
выполняет побитовое и между number
и 1
. Результат будет либо 0, либо 1, в зависимости от того, является ли он четным или нечетным. Затем результат сравнивается с 0, чтобы определить, даже ли это.
Здесь страница, описывающая побитовые операции.
Ответ 8
Он выполняет двоичный и против 1, который возвращает 0, если младший значащий бит не установлен
для вашего примера
00001010 (10)
00000001 (1)
===========
00000000 (0)
Ответ 9
Это логическая концепция дизайна побитовая и (И) операционная система.
return (2 и 1); означает преобразование значения в побитовые числа и компарацию функции (AND) и возвращает значение.
Предпочитаете эту ссылку http://www.roseindia.net/java/master-java/java-bitwise-and.shtml