Примечание: все следующие двоичные представления следует читать справа налево. Я не уверен, почему я думаю о них так, но я на самом деле не знал, что люди также представляют двоичные файлы слева направо. Смешение!Почему ~ 5 === -6 в JavaScript?
В статье MDN для поразрядных операторов JavaScript (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT) говорится, что оператор ~
является побитовым оператором NOT
.
В Википедии (https://en.wikipedia.org/wiki/Bitwise_operation#NOT) говорится: «Побитовое NOT или дополнение - это унарная операция, которая выполняет логическое отрицание для каждого бита, формируя дополнение к данному двоичному значению. Биты, которые равны 0, становятся 1 и те, которые 1 становятся 0. "
Теперь возьмите число 5 в двоичной системе: 0101
Если я печатаю ~5
в моем браузере консоли, я получаю -6
, двоичное представление 1110
. Я ожидал, что отрицание превратит 0101
в 1010
, что на самом деле 10 (или -2, если крайняя левая цифра считается значком).
Все объяснения, которые я прочитал в операторе JavaScript ~
, говорят, что он оценивает число - (x + 1), но это не объясняет мне логически, что этот оператор делает на «поразрядном» уровне.
В принципе, 0101
будет 1110
.
Каковы промежуточные шаги, чтобы засвидетельствовать это преобразование? Я вижу, что ведущий бит становится перевернутым, тем самым меняя знак. Но это все, что я могу собрать.
Go здесь : http://stackoverflow.com/questions/31377474/why-does-bitwise-not-1-equal-2 –
Это то же самое на всех компьютерах, которые используют систему с двумя дополнениями для отрицательных чисел – Soren
[~ x == = - (x + 1): -)] (http://stackoverflow.com/questions/34349350/what-does-xy-represent-in-javascript). – choz