Почему правильный арифметический сдвиг 3 в двоичную последовательность «0110 0100» приводит к «1110 1100» вместо «0000 1100»? - PullRequest
0 голосов
/ 17 июня 2019

В учебнике, который я смотрю, он просит меня сделать арифметическое смещение вправо к двоичной последовательности 0110 0100 на 3 (a >> 3). Я думал, что это 0000 1100, так как я бы добавил 3 нуля справа, учитывая, что самый старший бит - 0 (или это 01?), Но ключ ответа говорит, что правильный ответ - 1110 1100.

Арифметический сдвиг определяется следующим образом:

Арифметический сдвиг вправо заполняет левый конец k повторениями старшего значащего бита ...

Поскольку наиболее значимым битом в 0110 0100 является 0, не следует ли мне добавлять 0 вместо 1? Является ли самый значимый бит на самом деле 01?

В качестве отдельного примера, если бит относится к первым двум цифрам, а не только к первой, почему сдвиг вправо на 3 в двоичной последовательности 0111 0010, 0000 1110 вместо 1110 1110?

1 Ответ

0 голосов
/ 17 июня 2019
Index : 76543210
a >> 0: 01100100
a >> 1: 00110010
a >> 1: 00011001
a >> 1: 00001100

Другой пример:

Index : 76543210
a >> 0: 10000100
a >> 1: 11000010
a >> 1: 11100001
a >> 1: 11110000

Это именно так, как вы верите. Арифметический сдвиг, иначе известный как сдвиг со знаком, который уже дает вам хороший совет о том, что он делает, сдвигает биты влево или вправо, сохраняя при этом бит со знаком и при движении вправо копирует бит со знаком.

Вот формальное определение:

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

В записи Википедии есть несколько хороших иллюстративных картинок: https://en.wikipedia.org/wiki/Arithmetic_shift

Вероятно, автор просто испортил свой собственный пример, желая показать, что он сохраняет самый левый бит (в большинстве случаев) и копирует его. Хотя он забыл установить его.

...