Страницы

Операции сдвига

Операции сдвигов появились вместе с компьютерами. Они легко реализовываются на цифровых схемах и существуют практически на всех типах процессоров. В математике они заменяются операциями умножения и деления. Операции сдвигов удобно рассматривать на битовом представлении числа. При сдвиге все биты числа сдвигаются либо влево, либо вправо. Сдвиг на один бит влево равнозначен умножению на 2, сдвиг на один бит вправо равнозначен делению на 2. Есть отличия при операциях с беззнаковыми целыми числами и с целыми числами со знаком.

Логический (или беззнаковый) сдвиг влево

Логический сдвиг влево применяется при операциях над беззнаковыми целыми числами. При сдвиге влево все биты сдвигаются влево на один бит, старший бит отбрасывается, а в младший бит записывается 0. Если до операции в старшем бите была единица, то число после операции становится меньше исходного. В случае отбрасывания старшей единицы устанавливается флаг Carry.

Логический (беззнаковый) сдвиг вправо

Логический сдвиг вправо применяется при операциях над беззнаковыми целыми числами. При сдвиге вправо все биты сдвигаются вправо, отбрасывается младший бит, а в старший записывается 0. Если в младшем бите до операции была 1, то устанавливается флаг Carry.

Арифметический (для чисел со знаком) сдвиг вправо

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

Арифметический (для чисел со знаком) сдвиг влево

Арифметический сдвиг влево применяется при операциях со знаковыми целыми числами. При сдвиге влево все биты сдвигаются влево на один бит, старший бит отбрасывается, а в младший бит записывается 0. Если при сдвиге влево изменяется знаковый бит (с 1 на 0 или с 0 на 1), то происходит ситуация насыщение — устанавливается флаг Overflow и значение результата заменяется на максимальное целое число в случае, если до начала операции число было положительное или на минимальное целое, если до начала операции число было отрицательным. Арифметический сдвиг влево равнозначен выполнению операции умножения на 2.

Примеры

Рассмотрим использование арифметических и логических сдвигов. Для рассмотрения примеров выберем формат представления fractional данных.

Формат данных (Qm.n)
Общее количество бит (b)
Количество бит для целой части (m)
Количество бит для дробной части (n)

Введем произвольное значение вещественного числа в формате float-point. После введения, число автоматически конвертируется в формат fractional и его бинарное представления. Если исходное вещественное число выходит за пределы допустимого представления в формате fractional, то оно будет автоматически приведено к допустимым пределам. Например, попробуйте ввести 1 при выбранном формате Q1.15.

Сдвиги
Арифметический сдвиг
Логический сдвиг
Float-Point
Fractional16
Fractional2
Флаги
Overflow Carry