Непонимание использования правого сдвига в «Начиная C от новичка до профессионала» - PullRequest
0 голосов
/ 15 февраля 2019

Я не уверен, как этот сдвиг вправо равен 0: я понимаю, как работает сдвиг, но почему автор говорит, что он равен двоичному нулю, а другой результат - десятичному?Разве двоичный ноль не совпадает с десятичным нулем?

0000

Кроме того, как он даже равен двоичному нулю?

значение без знака int = 65372U;

В качестве двоичного значения в 2-байтовой переменной это:

1111 1111 0101 1100

Предположим, теперь вы выполнили следующую инструкцию:

unsigned intрезультат = значение >> 2;/ * Сдвиг вправо на два бита * /

Биты в значении будут сдвинуты на два места вправо, введя нули на левом конце, и результирующее значение будет сохранено в результате.В двоичном виде это будет 0, что является десятичным значением 16343.

0011 1111 1101 0111

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Сдвиг битов на практике включает буквальное перемещение битов N местами, поэтому для сдвига 2:

10101101
||||||
 \\\\\\
  \\\\\\
  vvvvvv
00101011

Математически сдвиг вправо на один бит эквивалентен делению на два,в то время как смещение влево эквивалентно умножению на два.Вы увидите, что эта оптимизация иногда используется, потому что сдвиг часто намного быстрее, чем умножение.

Это похоже на то, как в десятичных терминах деление на любую степень десяти легко, вы просто удаляете определенное количество цифр или перемещаете десятичную дробьместо.

0 голосов
/ 15 февраля 2019

Ваше предположение верно.Двоичный 0 - это то же самое, что и целое число 0. Книга в лучшем случае опечатка, а в худшем - просто неверная.Его примеры кажутся нормальными.

Также, для записи, двоичный 0 - это то, что вы ожидаете:

0000 0000 0000 0000

0011 1111 1101 0111 не равно 0.

...