/ / JS: Чому дорівнює ~ 10 (двійковий, ~ 1010) = -11 (двійковий, -1011)? - javascript, двійкові, побітові оператори, підписані, подвійні доповнення

JS: Чому ~ 10 (бінарний, ~ 1010) = -11 (бінарний, -1011)? - javascript, binary, bitwise-operators, signed, twos-complement

У Javascript, якщо я виконую побітові операції НЕ на десятковий знак ціле число 10:

~10

Я очікую, що він обчислить побіжно НЕ на бінарний ціле число наступним чином:

~1010 = 0101

Іншими словами, я очікував десяткового цілого числа 5. Натомість операція дає мені -11. (спробуйте в консолі)

~10 = -11

Якщо я перевіряю це більш чітко, дивлячись на -11 та ~ 10 як бінарні цілі рядки:

parseInt(~10,10).toString(2)
"-1011"

parseInt(-11,10).toString(2)
"-1011"

Послідовний. Але я не розумію. Чи хтось може мені пояснити, чому? Я здогадуюсь, що це щось пов'язане зі знаком.

EDIT: Я знайшов це питання після публікації це також допомогло мені зрозуміти це явище набагато краще.

Відповіді:

4 для відповіді № 1

Побітові оператори в Javascript трактують число як 32 біти. Так 10 є

00000000 00000000 00000000 00001010

Коли ви його інвертуєте, результат:

11111111 11111111 11111111 11110101

Коли трактується як 32-розрядний підписаний номер, це "s -11 (якщо ви не розумієте чому, читайте запис у Вікіпедії на Два доповнення)