Ответ 1
Компьютеры - это двоичные устройства. Из-за этого числа представляются последовательностью 1s и 0s.
Bitshifting просто перемещает последовательности 1s и 0s влево или вправо.
Таким образом, все, что делает оператор >>
, это сдвиг битов вправо один бит.
Рассмотрим число 101:
// Assuming signed 8-bit integers
01100101 // How 101 is represented in binary
00110010 // After right shifting one bit, this represents 50
Самый младший бит в этом случае был усечен. Очевидно, черт в деталях, но все, что есть на самом деле.
Оператор <<
выполняет противоположную операцию:
// Assuming signed 8-bit integers
01100101 // How 101 is represented in binary
11001010 // After left shifting one bit, this represents -54
// Assuming unsigned 8-bit integers
01100101 // How 101 is represented in binary
11001010 // After left shifting one bit, this represents 202
В этом случае самый старший бит был усечен, так как я использовал только 8 бит. Если число больше, но:
// Assuming signed 16-bit integers
00000000 01100101 // How 101 is represented in binary
00000000 11001010 // After left shifting one bit, this represents 202
00000001 10010100 // After left shifting one bit again, this represents 404
Таким образом, вы можете получать разные номера в зависимости от того, сколько бит и типов данных связано с этими битами, с которыми вы имеете дело.
Добавление: Если вам интересно, как работает бинарный файл, подумайте о том, как работает система десятичных чисел. Рассмотрим номер 5287. Его можно записать так:
5287
Но вы также можете записать это следующим образом:
5287 = (5 * 1000) + (2 * 100) + (8 * 10) + (7 * 1)
Что вы можете записать следующим образом:
5287 = (5 * 10^3) + (2 * 10^2) + (8 * 10^1) + (7 * 10^0)
Вышеприведенное уравнение объясняет, почему система десятичных чисел иногда называется базой-10. Система десятичных чисел использует 10 цифр (0-9). Обратите внимание, как показатели соответствуют позиции цифр.
Система двоичных чисел или система base-2 - это то же самое, но с номером два в качестве базы показателей и с использованием только двух цифр: 0 и 1.
5287 = 00010100 10100111 (base 2)
= (0 * 2^15) + (0 * 2^14) + (0 * 2^13) + (1 * 2^12)
+ (0 * 2^11) + (1 * 2^10) + (0 * 2^9) + (0 * 2^8)
+ (1 * 2^7) + (0 * 2^6) + (1 * 2^5) + (0 * 2^4)
+ (0 * 2^3) + (1 * 2^2) + (1 * 2^1) + (1 * 2^0)