Почему INT_MAX & x = x?
Выполняя вопрос ANDROUND о spoj, я хотел написать функцию запроса для моего дерева сегментов. В ситуации, когда l, r находятся вне диапазона, мне нужно вернуть число, которое при выполнении операции BITWISE AND не изменит ответ.
В одном из решений я заметил, что побитовое И любого числа с INT_MAX вернет нам само число.
Почему это так?
1 ответ
Потому что INT_MAX - это число, которое представлено только 1. для 32-битного int это представлено битовой последовательностью 11111111 11111111 11111111 11111111
, Теперь &
оператор проверяет, имеют ли оба числа значение 1 для некоторого индекса (например, если оба числа имеют значение 1 для индекса 5, результат будет иметь значение 1 для индекса 5). Если это так, результат будет иметь значение 1 в этом индексе, в противном случае он будет хранить значение 0 в этом индексе результата.
Так что, если вы считаете номер INT MAX - который снова, это битовая последовательность 11111111 11111111 11111111 11111111
и число 2, например, которое представлено битовой последовательностью 00000000 00000000 00000000 00000010
, Только во 2-м наименьшем индексе есть 1 в обоих числах, так что только там результат будет иметь 1, и 0 везде.
Горизонтальная визуализация
11111111 11111111 11111111 11111111
&
00000000 00000000 00000000 00000010
знак равно
00000000 00000000 00000000 00000010