Вычислить четность числа с помощью таблицы поиска
В этом посте мы увидим, как вычислить четность числа с помощью таблицы поиска. Четность связана с общим количеством единиц в двоичном числе.
Нечетная четность (закодированная как 1) означает нечетное количество единиц, а четная четность (закодированная как 0) означает четное количество единиц. Биты четности часто используются как простое средство обнаружения ошибок при передаче и приеме цифровых данных.
Наивным решением было бы вычислять четность, проверяя каждый бит заданного числа один за другим. Затрачиваемое время пропорционально общему количеству битов в числе. Мы можем работать лучше, выключая крайний правый установленный бит числа один за другим и находя четность. Время, которое требуется, пропорционально общему количеству установленных битов. Мы уже обсуждали эти решения в эта почта. В этом посте обсуждаются еще несколько интересных решений.
1. Разделяй и властвуй
Идея состоит в том, чтобы вычислить четность целого числа, рекурсивно разделив 32-битное целое число на две половины и используя их XOR до тех пор, пока не останется только 1 бит. Использование XOR аннулирует установленные биты в одной и той же позиции на две половины, и, поскольку четность не будет затронута, если мы удалим из нее даже установленные биты (почему?), проблема успешно уменьшается до половины на каждом шаге.
Например, мы изначально разделили 32–bit (4 bytes) целое число на два 16–bit куски и взять их XOR. Затем снова разделяем 16–bit врезаться в 8–bit куски и взять их XOR. затем 8–bit фрагменты далее делятся на 4–bits куски и так далее… Этот процесс продолжается до тех пор, пока не останется только 1 бит.
Ниже приведена реализация C++, Java и Python, основанная на приведенной выше идее:
Как определить четность двоичного числа
В информатике существует два понятия четности числа. Одно из них связано с кратностью числа двум, другое с кратностью числа, составляющих число, двоичных единиц двум. Перед разработкой алгоритма программы не лишне уточнить задание у преподавателя.
3.1. Определение чисел кратных двум
Для двоичной системы четность можно еще определить по наличию 1 в младшем разряде исследуемого слова , т.е. если там записана 1, то число нечетное, если там 0 – четное:
число 1563258 = 1.101.110.011.010.1012 – нечетное, т.к. в младшем разряде записана 1;
число 1245648 = 1.010.100.101.110.1002 – четное, т.к. в младшем разряде записан 0.
Существует несколько способов проверить содержимое младшего бита. Один из вариантов ‑ проверить наличие младшего бита логической операцией и анализировать содержимое флага нулевого результата:
Вычислить четность числа с помощью таблицы поиска
В этом посте мы увидим, как вычислить четность числа с помощью таблицы поиска. Четность связана с общим количеством единиц в двоичном числе.
Нечетная четность (закодированная как 1) означает нечетное количество единиц, а четная четность (закодированная как 0) означает четное количество единиц. Биты четности часто используются как простое средство обнаружения ошибок при передаче и приеме цифровых данных.
Наивным решением было бы вычислять четность, проверяя каждый бит заданного числа один за другим. Затрачиваемое время пропорционально общему количеству битов в числе. Мы можем работать лучше, выключая крайний правый установленный бит числа один за другим и находя четность. Время, которое требуется, пропорционально общему количеству установленных битов. Мы уже обсуждали эти решения в эта почта. В этом посте обсуждаются еще несколько интересных решений.
1. Разделяй и властвуй
Идея состоит в том, чтобы вычислить четность целого числа, рекурсивно разделив 32-битное целое число на две половины и используя их XOR до тех пор, пока не останется только 1 бит. Использование XOR аннулирует установленные биты в одной и той же позиции на две половины, и, поскольку четность не будет затронута, если мы удалим из нее даже установленные биты (почему?), проблема успешно уменьшается до половины на каждом шаге.
Например, мы изначально разделили 32–bit (4 bytes) целое число на два 16–bit куски и взять их XOR. Затем снова разделяем 16–bit врезаться в 8–bit куски и взять их XOR. затем 8–bit фрагменты далее делятся на 4–bits куски и так далее… Этот процесс продолжается до тех пор, пока не останется только 1 бит.
Ниже приведена реализация C++, Java и Python, основанная на приведенной выше идее:
Как работает такая проверка на четность/нечетность?
Встретил пример, проверка числа i на нечетность и никак не могу понять как работает данная проверка. Конкретно не понятен блок (i&1).
Выражение i & 1 выполняет побитовую операцию «И» между соответствующими битами обоих чисел. Как это работает? Представте оба числа i и 1 в двоичной записи. Например, если число i равно 1234567891, то в двоичной записи из 32-х бит (размер типа int в Java), то есть из 4-х байт, оно будет выглядить вот так:
А число 1, в такой же записи, выглядит вот так:
Теперь запишем оба числа в этой записи друг под другом и выполним операцию «И» между каждым битов верхнего числа со стоящим под ним битом нижнего:
Операция «И» возвращает 1 только если оба бита равны 1. В противном случае она возвращает 0. В нашем случае лишь крайнии справа биты обоих чисел равны 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 является признаком нечётности.
Напишите программу, проверяющую число на четность, используя только битовые операции
В этой задаче вам необходимо реализовать функцию, которая бы проверяла число на четность, используя только битовые операции AND, OR, NOT.
Решение
Заметим, что число x нечетно только тогда, когда самый младший (то есть первый справа) бит в его двоичной записи равен 1. Докажем это. Вспомним знакомый со школьной статьи алгоритм перевода числа из двоичной системы в десятеричную. Он показан на следующей картинке:
Мы можем вынести два за скобку из всех слагаемых, кроме последнего, которое может принимать значение либо 1, либо 0. Таким образом, если оно равно нулю, то сумма будет иметь вид 2(…) = x, то есть будет делиться на два, а если оно будет равно единице, то сумма будет иметь вид 2(…)+1 = x, то есть не будет делиться на два. Это является критерием четности. Ч.т.д.
Итак, мы доказали факт того, что число нечетно, когда его младший бит равен 1, и четно, когда младший бит равен 0. Остался вопрос: как получить последний бит числа. Утверждение: последний бит числа x равен x&1, где & — побитовое И. Почему это так? И равно 1 только когда оба его аргумента равны 1. Число 1 в двоичной системе счисления имеет следующий вид: …000001 (в зависимости от того, скольки битными числами мы оперируем). А значит, при побитовом И единицы с числом х у результата все биты, кроме последнего, будут равны нулю, а последний бит будет равен 1, если в числе x он был равен 1 (1&1 = 1), и 0, если в числе x он был 0 (0&1 = 0).
Таким образом, значение выражения x&1 равно 1, если число x нечетное, и 0, если x четное.
Как определить четность двоичного числа
Как по двоичной записи числа определить, чётное оно или нет?
Как быстро выучить стихотворение наизусть? Запоминание стихов является стандартным заданием во многих школах.
Как научится читать по диагонали? Скорость чтения зависит от скорости восприятия каждого отдельного слова в тексте.
Как быстро и эффективно исправить почерк? Люди часто предполагают, что каллиграфия и почерк являются синонимами, но это не так.
Как научится говорить грамотно и правильно? Общение на хорошем, уверенном и естественном русском языке является достижимой целью.
Двоичное счисление на пальцах
Все знают, что компьютеры состоят из единиц и нулей. Но что это значит на самом деле?
Если у вас в школе была информатика, не исключено, что там было упражнение на перевод обычных чисел в двоичную систему и обратно. Маловероятно, что кто-то вам объяснял практический смысл этой процедуры и откуда вообще берётся двоичное счисление. Давайте закроем этот разрыв.
Эта статья не имеет практической ценности — читайте её просто ради интереса к окружающему миру. Если нужны практические статьи, заходите в наш раздел «Где-то баг», там каждая статья — это практически применимый проект.
Отличный план
Чтобы объяснить всё это, нам понадобится несколько тезисов:
- Система записи числа — это шифр.
- Мы привыкли шифровать десятью знаками.
- Но система записи чисел может быть любой. Это условность.
- Двоичная система — это тоже нормальная система.
- Всё тлен и суета.
Система записи — это шифр
Почему 9 означает «девять»? И почему вообще есть такое слово? Почему такое количество мы называем этим словом? Вопрос философский, и короткий ответ — нам нужно одинаково называть числа, чтобы друг друга понимать. Слово «девять», цифра 9, а также остальные слова — это шифр, который мы выучили в школе, чтобы друг с другом общаться.
Нам очень легко расшифровывать записи типа 12, 1920, 100 500 и т. д. — мы к ним привыкли, мы учили это в школе. Но это шифр. 12 × — это не то же самое, что . Это некая абстракция, которой мы пользуемся, чтобы упростить себе счёт.
Мы привыкли шифровать десятью знаками
У нас есть знаки 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9 — всего десять знаков. Этим числом знаков мы шифруем количество единиц, десятков, сотен, тысяч и так далее.
Мы договорились, что нам важен порядок записи числа. Мы знаем, что самый правый знак в записи означает число единиц, следующий знак (влево) означает число десятков, потом сотен и далее.
Например, перед нами число 19 547. Мы знаем, что в нём есть:
Если приглядеться, то каждый следующий разряд числа показывает следующую степень десятки:
Нам удобно считать степенями десятки, потому что у нас по десять пальцев и мы с раннего детства научились считать до десяти.
Система записи — это условность
Представим бредовую ситуацию: у нас не 10 пальцев, а 6. И в школе нас учили считать не десятками, а шестёрками. И вместо привычных цифр мы бы использовали знаки ØABCDE. Ø — это по-нашему ноль, A — 1, B — 2, E — 5.
Вот как выглядели бы привычные нам цифры в этой бредовой системе счисления:
0 — Ø 1 — A 2 — B 3 — C 4 — D 5 — E |
6 — AØ 7 — AA 8 — AB 9 — AC 10 — AD 11 — AE |
12 — BØ 13 — BA 14 — BB 15 — BC 16 — BD 17 — BE |
18 — CØ 19 — CA 20 — CB 21 — CC 22 — CD 23 — CE |
24 — DØ 25 — DA 26 — DB 27 — DC 28 — DD 29 — DE |
30 — EØ 31 — EA 32 — EB 33 — EC 34 — ED 35 — EE |
36 — AØØ 37 — AØA 38 — AØB 39 — AØC 40 — AØD 41 — AØE |
В этой системе мы считаем степенями шестёрки. Число ABADØ можно было бы перевести в привычную нам десятичную запись вот так:
A × 6 4 = 1 × 1296 = 1296
B × 6 3 = 2 × 216 = 432
A × 6 2 = 1 × 36 = 36
D × 6 1 = 4 × 6 = 24
Ø × 6 0 = 0 × 1 = 0
1296 + 432 + 36 + 24 + 0 = 1788. В нашей десятичной системе это 1788, а у людей из параллельной вселенной это ABADØ, и это равноценно.
Выглядит бредово, но попробуйте вообразить, что у нас в сумме всего шесть пальцев. Каждый столбик — как раз шесть чисел. Очень легко считать в уме. Если бы нас с детства учили считать шестёрками, мы бы спокойно выучили этот способ и без проблем всё считали. А счёт десятками вызывал бы у нас искреннее недоумение: «Что за бред, считать числом AD? Гораздо удобнее считать от Ø до E!»
То, как мы шифруем и записываем числа, — это следствие многовековой традиции и физиологии. Вселенной, космосу, природе и стадам коров глубоко безразлично, что мы считаем степенями десятки. Природа не укладывается в эту нашу систему счёта.
Например, свет распространяется в вакууме со скоростью 299 792 458 метров в секунду. Ему плевать, что нам для ровного счёта хотелось бы, чтобы он летел со скоростью 300 тысяч километров в секунду. А ускорение свободного падения тела возле поверхности Земли — 9,81 м/с 2 . Так и хочется спросить: «Тело, а ты не могло бы иметь ускорение 10 м/с 2 ?» — но телу плевать на наши системы счисления.
Двоичная система (тоже нормальная)
Внутри компьютера работают транзисторы. У них нет знаков 0, 1, 2, 3… 9. Транзисторы могут быть только включёнными и выключенными — обозначим их и ⚫.
Мы можем научить компьютер шифровать наши числа этими транзисторами так же, как шестипалые люди шифровали наши числа буквами. Только у нас будет не 6 букв, а всего две: и ⚫. И выходит, что в каждом разряде будет стоять не число десяток в разной степени, не число шестёрок в разной степени, а число… двоек в разной степени. И так как у нас всего два знака, то получается, что мы можем обозначить либо наличие двойки в какой-то степени, либо отсутствие:
Если перед нами число ⚫⚫⚫ ⚫⚫, мы можем разложить его на разряды, как в предыдущих примерах:
256 + 0 + 64 + 0 + 0 + 8 + 4 + 0 + 0 = 332
Получается, что десятипалые люди могут записать это число с помощью цифр 332, а компьютер с транзисторами — последовательностью транзисторов ⚫⚫⚫ ⚫⚫.
Если теперь заменить включённые транзисторы на единицы, а выключенные на нули, получится запись 1 0100 1100. Это и есть наша двоичная запись того же самого числа.
Почему говорят, что компьютер состоит из единиц и нулей (и всё тлен)
Инженеры научились шифровать привычные для нас числа в последовательность включённых и выключенных транзисторов.
Дальше эти транзисторы научились соединять таким образом, чтобы они умели складывать зашифрованные числа. Например, если сложить ⚫⚫ и ⚫⚫, получится ⚫. Мы писали об этом подробнее в статье о сложении через транзисторы.
Дальше эти суммы научились получать супербыстро. Потом научились получать разницу. Потом умножать. Потом делить. Потом всё это тоже научились делать супербыстро. Потом научились шифровать не только числа, но и буквы. Научились их хранить и считывать. Научились шифровать цвета и координаты. Научились хранить картинки. Последовательности картинок. Видео. Инструкции для компьютера. Программы. Операционные системы. Игры. Нейросети. Дипфейки.
И всё это основано на том, что компьютер умеет быстро-быстро складывать числа, зашифрованные как последовательности включённых и выключенных транзисторов.
При этом компьютер не понимает, что он делает. Он просто гоняет ток по транзисторам. Транзисторы не понимают, что они делают. По ним просто бежит ток. Лишь люди придают всему этому смысл.
Когда человека не станет, скорость света будет по-прежнему 299 792 458 метров в секунду. Но уже не будет тех, кто примется считать метры и секунды. Такие дела.
Чётные числа в двоичной системе всегда оканчиваются на 0, а нечётные – на 1.
При выполнении арифметических операций в ЭВМ применяют специальные коды для представления чисел: прямой, обратный и дополнительный коды чисел.
Прямой код двоичного числа – это само двоичное число.
Обратный код положительного числа совпадает с прямым, а при записи отрицательного числа все его цифры, кроме цифры, изображающей знак числа, заменяются на противоположные (0 заменяется на 1, а 1 – на 0).
Пример: Дано число X=-1011. Перевести число в обратный код. Хобр=1.0100
Дополнительный код положительного числа совпадает с прямым, а код отрицательного числа образуется как результат увеличения на 1 его обратного кода.
Пример: Дано число X=-1011. Перевести в дополнительный код. Хдоп=1.0101
Варианты заданий с решением
1. Дано: , . Какое из чисел С, записанных в двоичной системе счисления, удовлетворяет неравенству ?
Решение: При переводе a и b в двоичное представление, получим: a=AA16 =101010102 , b=2558 =101011012 . Отсюда следует, что подходит значение 101011002,
Ответ: 4
2. Чему равна сумма чисел 718 и 1F16?
Решение: Надо представить числа в двоичном виде и поразрядно сложить:
718=1110012 каждая цифра в 8-ой системе представляется 3-мя битами, 1F16=111112 каждая цифра в 16-ой системе представляется 4-мя битами. (Представление 8-х и 16-х чисел в двоичном виде надо знать!)
Полученное двоичное число представим в 8-м и 16-м виде: 10110002=5816=1308 =8810.
Ответ: 4
3. Для передачи по каналу связи сообщения, состоящего только из символов А, Б, В и Г используется посимвольное кодирование: А-0, Б-11, В-100, Г-011. Через канал связи передается сообщение: ГБАВАВГ. Закодируйте сообщение данным кодом. Полученную двоичную последовательность переведите в восьмеричный код.
1) DBACACD 2) 75043 3) 7A23 4) 3304043
Решение: Заменяя в сообщении буквы на соответствующий код, получим следующую последовательность:
0111101000100011. Разобьем эту последовательность на триады справа налево: 111 101 000 100 011, представив каждую триаду в виде 8-го числа, получим: 75043
Ответ: 2
4. Укажите через запятую в порядке возрастания все десятичные числа, не превосходящие 26, запись которых в троичной системе счисления оканчивается на 22?
Решение: Для решения задачи достаточно рассмотреть следующие числа в троичной системе счисления: 223, 1223, 2223 и перевести их в десятичную систему счисления:
5. Сколько единиц в двоичной записи десятичного числа 513?
1) 5 2) 2 3) 3 4) 4
Решение: 513=512+1 => 512=2 9 = 10000000002 => 513= 10000000002 +1=10000000012
6. Сколько значащих нулей в двоичной записи числа 254?
1) 1 2) 2 3) 4 4) 8
Решение: 254=255 — 1 => 255=2 8 -1=111111112 – 1=111111102
7. Для хранения целого числа со знаком используется один байт. Сколько единиц содержит внутреннее представление числа (-78)?
1) 3 2) 4 3) 5 4) 6
1) переводим число 78 в двоичную систему счисления:
78 = 64 + 8 + 4 + 2 = 2 6 + 2 3 + 2 2 + 2 1 = 10011102
2) по условию число занимает в памяти 1 байт = 8 бит, поэтому нужно представить число с помощью 8 разрядов, причем старший разряд — знаковый
3) в прямом коде число будет представлено в виде:
4) делаем инверсию битов (заменяем везде, кроме знакового разряда, 0 на 1 и 1 на 0) и получим число в обратном коде:
5) добавляем к результату единицу и получим число в дополнительном коде:
6) в записи этого числа 4 единицы
8. Запись числа 6710 в системе счисления с основанием N оканчивается на 1 и содержит 4 цифры. Чему равно основание этой системы счисления N?
Решение 1: Начнем с двоичной системы. Для хранения числа 67 необходимо 7 цифр, т.к. 64<67<128. 128=2 7 . Рассмотрим троичную систему. Для хранения числа 67 нужно 4 цифры, т.к. 27<67<81. 81=3 4 . Следовательно, троичная система удовлетворяет условию: "число содержит 4 цифры". Теперь необходимо проверить, удовлетворяет данная система условию: "число оканчивается на 1". Для этого нужно перевести 6710 в троичную систему. Но полный перевод делать не надо, т.к. нас интересует только первый остаток, на него и будет оканчиваться 67 в троичной системе.
Остаток равен 1. Следовательно, и второе условие выполнено, поэтому троичная система подходит. Основание троичной системы равно 3.
Решение 2: Так как запись в системе счисления с основанием N заканчивается на 1, то остаток от деления числа 67 на N равен 1. Таким образом можно записать, что при некотором целом :
Из последнего выражения видно, что N (основание системы счисления) является делителем числа 66. Делителями числа 66 являются следующие натуральные числа: 2, 3,6, 11, 22, 33, 66.
Но нам известно, что запись числа содержит 4 цифры, то есть
Выпишем кубы и четвертые степени первых натуральных чисел, которые являются делителями числа 66:
Видно, что из этого списка только для числа N = 3 выполняется условие . Таким образом, ответ – 3. Проверим это, переведя число 67 в троичную систему: 6710 = 21113
9. Все 5-буквенные слова, составленные из букв А, О, У, записаны в алфавитном порядке. Вот начало списка:
Запишите слово, которое стоит на 240-м месте от начала списка.
Список после замены станет таким:
Видно, что это числа, идущие по порядку от нуля в троичной системе. В десятичной системе счисления список бы был таким: 0, 1 , 2, 3.
Нам нужно найти, какое число будет стоять на 240 месте. Т.к. список чисел начинается с нуля, следовательно, нам нужно перевести число 239 в троичную систему счисления. Получим число: 222123. Переведем обратно в символы: УУУОУ.
Ответ: УУУОУ
10. В таблице ниже представлена часть кодовой таблицы ASCII:
Символ | A | B | Q | a | b |
Десятичный код | |||||
Шестнадцатеричный код |
Каков шестнадцатеричный код символа “q” ?
11. Решите уравнение .
Ответ запишите в шестеричной системе счисления. Основание системы счисления указывать не нужно.
Решение: Надо перевести все числа в десятичную систему, решить уравнение и результат перевести в шестеричную систему:
2) из уравнения получаем
3) переводим 15 в шестеричную систему счисления:
12. Запись десятичного числа в системах счисления с основаниями 3 и 5 в обоих случаях имеет последней цифрой 0. Какое минимальное натуральное десятичное число удовлетворяет этому требованию?
Решение: если запись числа в системе счисления с основанием N заканчивается на 0, то это число делится на N нацело, поэтому в данной задаче требуется найти наименьшее натуральное число, которое делится одновременно на 3 и на 5, то есть это число15.
13. Укажите, сколько всего раз встречается цифра 2 в записи чисел 10, 11, 12, …, 17 в системе счисления с основанием 5.
Как работает такая проверка на четность/нечетность?
Встретил пример, проверка числа i на нечетность и никак не могу понять как работает данная проверка. Конкретно не понятен блок (i&1).
Выражение i & 1 выполняет побитовую операцию «И» между соответствующими битами обоих чисел. Как это работает? Представте оба числа i и 1 в двоичной записи. Например, если число i равно 1234567891, то в двоичной записи из 32-х бит (размер типа int в Java), то есть из 4-х байт, оно будет выглядить вот так:
А число 1, в такой же записи, выглядит вот так:
Теперь запишем оба числа в этой записи друг под другом и выполним операцию «И» между каждым битов верхнего числа со стоящим под ним битом нижнего:
Операция «И» возвращает 1 только если оба бита равны 1. В противном случае она возвращает 0. В нашем случае лишь крайнии справа биты обоих чисел равны 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 является признаком нечётности.