2¹⁶-1 & 2⁵ = 2⁵ (или? Очевидно?)
Разработчик спросил меня сегодня, что поразрядно 65535 & 32 то есть 2¹⁶-1 & 2⁵ =? Сначала я подумал, что спонтанно 32, но мне показалось, что легко, после чего я думал несколько минут, а затем ответил 32. 32 кажется правильным, но как? 65535 = 2¹⁶-1 = 1111111111111111 (но это не кажется правильным, так как все двоичные числа должны быть -1 (?)), 32 = 100000, но я не мог преобразовать это в своей голове, после чего я все равно ответил 32, так как у меня было ответить на что-то. Действительно ли ответ 32 тривиален? Точно так же 2¹⁶-1 и 2⁵-1 = 31? Почему разработчик спросил меня о именно 65535?
Двоичное значение, которое меня попросили оценить, было 1111111111111111 & 100000, но я не понимаю, почему 1111111111111111 не равно -1. Разве это не должно быть -1? 65535 - число, которое дает переполнение, и как я узнаю это?
Ответы:
В этом случае число рассматривается как целое число без знака, что означает, что все установленные биты не будут давать -1 (если оно было подписано, тогда да, вы были бы правы). Таким образом, все 16 установленных битов дадут вам 65535.
Интересно, что подписанное состояние не является фактором при выполнении логических битовых операций. Сами биты не подписаны, поскольку они являются самым низким компонентом в компьютере. Это определяется операцией процессора, если биты в ex. регистр будет считаться подписанным или неподписанным.
Отрицательные числа производятся путем установки старшего значащего бита (MSB) в значение true, ЕСЛИ число рассматривается как знаковое (какая «сторона» или какой внешний бит будет установлен, зависит от архитектуры ЦП, т. Е. Big-endian / little-endian )
источник
Это является тривиальным. 65535 в двоичном коде - это все единицы, поэтому AND с любым X меньше 65535 даст вам X.
источник
Отвечая на вторую часть вашего вопроса. Вы пометили его как 32-битный, так что 65535 в 32-битном
00000000000000001111111111111111
, подписан или без знака, это не -1.источник