cormorant
Получается eval(“1 << 10”) это двойка в 10-й степени.
Типа того, или даже для наглядности пример 3 (b11) и сдвинем влево на 10 бит: 3<<10 = 3*2^10 = 3072 (b110000000000)
Сдвиг вправо (>>),
можно считать обратным оператором к сдвигу влево, и работает он так как будто вместо умножения мы используем деление, т.е. 3072 >> 10 = 3072/2^10 = 3(b11). А если например мы возьмём 3083(b110000001011), которое вообще простое (делится только на единицу и само себя), и “затрём” правые 10 байт получим те же 3 (b11). В самом деле, вычислив это на обычном калькуляторе 3083/2^10 получим 3.00683, мы можем просто округлить до минимального целого значения.
Аналогично для отрицательных чисел -3083/2^10 = -3.00683, что значит -3083 >> 10 = -4.
С числами которые представляются в памяти специальными видами и разбиваются на мантиссу, основание и пр. - это не работает.
Наверное покажется зачем это всё надо, но дело в том что исторически сложилось, что большинство компьютеров так или иначе совершают действие над бинарным кодом, с очень распараллеленной конфигурацией. А 8-и или 16-и -ричные системы счисления, служат своеобразным промежуточным звеном между обычным человеческим восприятием чисел и бинарным машинным кодом. В которых (8-и 16-и) одно число соответствует постоянному количеству бит: 3 и 4 соответственно. Что удобно.
В 10-ой системе это не так. Например: 9 = b1001, а 10 = b1010. В двоичной для обоих случаев это 4 бита, а в 10-ой первый случай одно слово, второй - два.
Дак зачем это надо? =) Вообщем, компьютер лучше понимает эти штуки (сдвиги), и выполняет за меньшее число тактов, что при правильном подходе при ёмких вычислениях, может сэкономить кучу времени.