Python: Почему сдвиг вправо >> округляется вниз и где его следует использовать? - PullRequest
3 голосов
/ 23 февраля 2010

Я никогда не использовал операторы >> и << не потому, что они мне никогда не были нужны, а потому, что я не знаю, мог ли бы я их использовать или где я должен был.

100 >> 3 выводит 12 вместо 12.5. Почему это. Возможно, изучение того, где лучше всего использовать правый сдвиг, ответит на это косвенно, но мне любопытно.

Ответы [ 4 ]

13 голосов
/ 23 февраля 2010

Сдвиг вправо не деление

Давайте посмотрим, что на самом деле делает смещение вправо , и это станет ясно.

Сначала напомним, что число хранится в памяти как набор двоичных цифр. Если у нас есть 8 бит памяти, мы можем сохранить 2 как 00000010 и 5 как 00000101.

Сдвиг вправо берет эти цифры и сдвигает их вправо. Например, сдвиг вправо вышеупомянутых двух цифр на одну даст 00000001 и 00000010 соответственно.

Обратите внимание, что самая низкая цифра ( вправо -мост) полностью смещена от конца и не влияет на конечный результат.

4 голосов
/ 23 февраля 2010

>> и << - правый и левый битовый сдвиг операторы соответственно. Вы должны посмотреть на двоичное представление чисел.

>>> bin(100)
'0b1100100'
>>> bin(12)
'0b1100'
2 голосов
/ 23 февраля 2010

Другие ответы объясняют идею битшифтинга, но вот конкретно, что происходит для 100 >> 3

100
128 64 32 16 8 4 2 1
  0  1  1  0 0 1 0 0 = 100
100 >> 1
128 64 32 16 8 4 2 1
  0  0  1  1 0 0 1 0  = 50
100 >> 2
128 64 32 16 8 4 2 1
  0  0 0  1  1 0 0 1  = 25
100 >> 3
128 64 32 16 8 4 2 1
  0  0  0  0 1 1 0 0  = 12

Вам не нужно часто его использовать, если только вам не нужно действительно быстрое деление на 2, но даже тогда НЕ ИСПОЛЬЗУЙТЕ ЕГО. это делает код намного сложнее, чем нужно, и разница в скорости незаметна.

Основное время, которое вам когда-либо понадобилось бы использовать, было бы, если вы работаете с двоичными данными, и вам конкретно нужно сдвинуть биты вокруг. Единственное реальное использование, которое я использовал для этого, это чтение и запись тегов ID3, которые хранят информацию о размере в 7-битных байтах, например:

0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx.

, который должен быть составлен так:

0000xxxx xxxxxxxx xxxxxxxx xxxxxxxx

чтобы получить нормальное целое число в памяти.

1 голос
/ 23 февраля 2010

Бит со сдвигом целого числа дает другое целое число. Например, число 12 записывается в двоичном виде как 0b1100. Если мы сдвигаем бит на 1 вправо, мы получаем 0b110 = 6. Если мы сдвигаем бит на 2, мы получаем 0b11 = 3. И, наконец, если мы сдвигаем бит на 3, мы получаем 0b1 = 1, а не 1,5. Это связано с тем, что биты, сдвинутые за пределы регистра, теряются.

Один простой способ думать об этом - сдвиг битов вправо на N - это то же самое, что деление на 2 ^ N с последующим усечением результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...