побитовое отрицание и побитовое XOR 1 не эквивалентны?

Моя дискретная математика говорит мне, что отрицание каждого бита двоичного числа эквивалентно операции XOR с 1. То есть:

~1010 === 0101
1010 XOR 111 = 0101

Но это не работает в javascript:

~123 === -124
123 ^ 1 === 122

Почему?


person Boyang    schedule 21.01.2017    source источник
comment
1 в десятичной системе не равно 111 в двоичной.   -  person Sebastian Simon    schedule 22.01.2017
comment
Обобщение произвольной ширины - XOR с -1 (что также работает для однобитового случая)   -  person harold    schedule 22.01.2017
comment
@harold, можешь объяснить, почему это работает?   -  person Boyang    schedule 22.01.2017
comment
@Boyang, потому что все установленные биты любой длины равны -1 для этой длины. Доказательство: добавление к нему 1 переносит все биты и дает ноль. все биты установлены + 1 = 0, поэтому все биты установлены = -1.   -  person harold    schedule 22.01.2017
comment
@гарольд хорошо. Вы можете добавить ответ, если хотите, и я приму   -  person Boyang    schedule 22.01.2017


Ответы (1)


1 не двоичный 111

Отрицание каждого бита числа эквивалентно XOR каждого бита с 1, т. е. с числом одинакового размера, где все биты равны 1.

Для одного байта вы захотите выполнить операцию xor с двоичным числом 11111111, которое равно десятичному числу 255, а не 1. Десятичное число 1 — это двоичное число 00000001, поэтому в побитовом XOR вы инвертируете только последний бит.

person Peteris    schedule 21.01.2017
comment
Ok. Как я могу убедиться, что выполняю операцию XOR с 11111...? Может 123 ^ (2**32)? - person Boyang; 22.01.2017
comment
2**32 это 100...000. Обычно вы просто записываете шестнадцатеричную константу 0xFFFFFFFF, которая равна 32 битам 11...11. - person Peteris; 22.01.2017