Найти - Пользователи
Полная версия: Что за shift - сдвиг? - в операторах языка ("<<" ">>")
Начало » Python для новичков » Что за shift - сдвиг? - в операторах языка ("<<" ">>")
1
cormorant
Для почти-гуманитаев, не знающих ни двоичной ни 16-й прочих систем (у меня 10 пальцев), объясните пожалуйста, почему:
In [18]: for i in xrange(5): 1 << 10*i
даёт
Out[18]: 1
Out[18]: 1024
Out[18]: 1048576
Out[18]: 1073741824
Out[18]: 1099511627776
В паскале был какой-то побайтовый сдвиг, что-то типа этого? прошу объяснить на пальцах
alexx11
cormorant
Для почти-гуманитаев, не знающих ни двоичной ни 16-й прочих систем (у меня 10 пальцев), объясните пожалуйста, почему:
На самом деле что б понимать это не надо быть семи пядей во лбу, это очень просто. Если мы с 10 пальцами, привыкли умножать на 10, дописав нолик в конце (12*10 = 120), то в двоичной системе так же просто умножается на 2, при этом сама 2 в двоичной системе это b10, таким образом (b100011*b10 = b1000110). И если это проделать для 1:
(1=1=b1)
(1*2=2=b10)
(2*2=4=b100)
(4*2=8=b1000)
и т.д. получается просто степень двойки. Как и в десятичной 1,10,100,1000 - это степени десятки.
cormorant
Получается eval(“1 << 10”) это двойка в 10-й степени. В цикле можно написать
for i in xrange(5): 2**(10*i)
.
А что со значком “>>”? Сам не вник
alexx11
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-ой первый случай одно слово, второй - два.

Дак зачем это надо? =) Вообщем, компьютер лучше понимает эти штуки (сдвиги), и выполняет за меньшее число тактов, что при правильном подходе при ёмких вычислениях, может сэкономить кучу времени.
Zubchick
вообще все еще проще, это сдвиг битов влево и вправо соответственно :)

Когда мы сдвигаем все биты влево на 1н:
было:  0 0 1 1
стало: 0 1 1 0
вправо соответственно:
было:  0 0 1 1
стало: 0 0 0 1
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB