Решил углубиться в побитовые операции. Но не понимаю одной вещи.
Допустим, у нас есть 9 (10) = 0000 0000 0000 0000 0000 0000 0000 1001 (2)
Оператор ~ инвертирует все биты на противоположные, в итоге ~9 (10) получается:
1111 1111 1111 1111 1111 1111 1111 0110 (2), которому соответствует -10 (10).
Но если начать переводить в двоичную систему 1111 1111 1111 1111 1111 1111 1111 0110 получается огромное число, никак не 10! Почему так? Как из него получают -10?
И ещё вопрос, количество битов - это количество разрядов в двоичной системе? Т.е. в выше указанных примерах это и есть 32-хразрядные числа? А касательно 64-хбитной, там такая же запись чисел - т.е. старшие биты слева и, если число маленькое, старшие заменяются 0-ми, чтобы общее число знаков было 64?
Есть несколько подходов к кодированию отрицательных чисел. Если смотреть на десятичное представление 1111 1111 1111 1111 1111 1111 1111 0110 последовательности как на число закодированное как “signed 32 bit”, то будет получатся -10. Если эту же последовательность раскодировать как "unsigned 32 bit, то будет получаться то большое число 4294967286 что ты наблюдаешь.
Бинарные опирации в js кодируют входные числа в signed 32 bit.
Да.
Да.
От себя добавлю что сам не имел опыта работы с бинарными преобразованиями. Разобрался с вопросом, исследуя документацию. Так что дополнения-уточнения приветствуются.