2016-05-12 5 views
11

Примечание: все следующие двоичные представления следует читать справа налево. Я не уверен, почему я думаю о них так, но я на самом деле не знал, что люди также представляют двоичные файлы слева направо. Смешение!Почему ~ 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.

Каковы промежуточные шаги, чтобы засвидетельствовать это преобразование? Я вижу, что ведущий бит становится перевернутым, тем самым меняя знак. Но это все, что я могу собрать.

+3

Go здесь : http://stackoverflow.com/questions/31377474/why-does-bitwise-not-1-equal-2 –

+0

Это то же самое на всех компьютерах, которые используют систему с двумя дополнениями для отрицательных чисел – Soren

+2

[~ x == = - (x + 1): -)] (http://stackoverflow.com/questions/34349350/what-does-xy-represent-in-javascript). – choz

ответ

3

Он действительно работает по-разному, отрицательное число находится в two's complement. Таким образом, значение 1010 равно -6.

В дополнение к дополнению в основном самый левый бит означает отрицательное число и принимается за отрицательное значение. Все остальные 1 бит добавляются к этому числу. Например:

1010 => (-8 +0 +2 +0) => -6 
1111 => (-8 +4 +2 +1) => -1 
2

Why does bitwise "not 1" equal -2? та же идея. Ответ
Cerebrus в приведенной выше ссылке (двоичное R -> L):
Есть 2 целых числа от 1 и -2: 0 и -1

1 в двоичной системе является 00000000000000000000000000000001
0 в двоичной системе является 00000000000000000000000000000000
-1 в двоичной системе является 11111111111111111111111111111111
-2 в двоичной системе является 11111111111111111111111111111110
("двоичный" является дополнением 2, в случае побитового не ~)

+0

Это я понимаю (я думаю). Для меня 1 будет '001', а -2 будет' 110', который является 1 с перевернутыми битами. Но просто инвертирование битов не превращается в 5 в -6. – papiro

+0

Теперь я вижу свое замешательство! Крайний левый бит предназначен не только для обозначения знака, но и для чего-то отрицательного. Поэтому '110' выглядел как отрицательный-два-ноль, но на самом деле (-4) -2-0, который добавил все вместе -2! Трудный хитрый – papiro

2

Вы очень близко подошли к решению, понимая, что первый бит является признаком, однако, остальные биты не используются «как есть». На самом деле, в вычислениях, подписанные числа представлены дополнением двух.

Есть подробные статьи о концепции на Wikipedia и других других веб-сайтах, но вкратце, когда первый бит равен 1 (с указанием отрицательного числа), остальные биты составляют число, которое в основном показывает, сколько вы добавить к минимальному числу (например,в 8-битовом целое минимальное значение будет -256, которое равно 11111111, поэтому инвертирование 5 (00000101) становится 11111010 или 250, поэтому вы можете получить десятичное значение, добавив 250 к -256, и получите -6). Это объяснение является упрощением для десятичных систем, но для полного понимания того, как это работает, вы должны действительно прочитать целую статью о дополнении двух.

2

Вы спутать битом знака и где он находится ....

Продлить количество битов (к, например, очень короткий междунар 8 бит) и посмотреть

00000110 6 

Бит инверсии ~

00000101 5 
11111010 ~5 (bitwise inversion of 5) 

И отсчет от нуля

00000000 0 
11111111 -1 
11111110 -2 
11111101 -3 
11111100 -4 
11111011 -5 
11111010 -6 

Так

11111010 -6 

и

11111010 ~5 

то же самое.

Это верно не только для JavaScript, но для чего-нибудь, который работает на компьютере, на основе систем счисления 2 комплемента - не уверен, что если JavaScript когда-либо работать на что-нибудь еще :-)

Смежные вопросы