- в этом случае при сдвиге на 1 разряд будет производиться деление на 2, - сдвигая вправо на 2 разряда будет производиться деление на 4 и т.д...
Что самое интересное, сдвиг можно производить и с десятичными числами! Взять то же число 1010 и сдвинуть его влево - т.е. мы присоединяем дополнительный 0 со стороны младшего разряда. Получается 10010 В основе сдвига операция производится с основой системы счисления к которой относится число, над которым проводятся операции сдвига.
В Терминале при помощи Python'а можно также производить операцию сдвига применительно к числам.
Производится эта операция посредством оператора:
- "<<" для сдвига влево - ">>" для сдвига вправо
Если применять сдвиг к десятичным числам в Питоне, то операция производится путем битового сдвига, т.е. происходит преобразование десятичного числа в двоичное, далее применяется сдвиг и полученное число снова преобразуется в десятичное.
Т.е. если мы наберем в Терминале:
6 << 1 # сдвигаем 6 влево на один разряд
То получим12, т.е. произошло умножение на 2
Если полученное число 12 сдвинуть влево на один разряд еще раз
12 << 1
Получим 24
Соответственно при сдвиге вправо происходит деление: Сдвинем десятичное число 24 вправо на один разряд
24 >> 1
Получим - 12
Чтобы применить сдвиг к другой системе счисления, необходимо использовать соответствующую запись. Например для двоичного числа:
0b0011 << 1
В результате получаем6 Двоичная форма записи после сдвига преобразовывается в десятичное.
4
Отрицательное число
Это числа меньше нуля, записываются с приставкой "-" перед числом... Определение отрицательного числа: при наличии положительного числа "a" при сложении такого же отрицательного числа дает в результате НОЛЬ, т.е. при взаимном сложении они "уничтожаются"
Для двоичного формата это утверждение также справедливо
Естественно данные примеры производятся над ЗНАКОВЫМИ числами, в которых старший разряд отведен под указание того, какой знак у числа. При программировании мы как правило всегда знаем с какого типа данными мы работаем - со знаковыми или беззнаковыми... В основном, в языках программирования производится так называемое "объявление" переменной, когда мы явным образом указываем с каким типом чисел (в данном случае) мы будем работать. При объявлении числа типом int - мы будем работать со знаковыми числами, а если число объявить как unsigned int - тогда число будет восприниматься беззнаковым (без какого либо указания на знак в старшем бите). По умолчанию - числа используются со знаком. Если нам необходимо работать с беззнаковими числами, то мы это должны указать явно.
Если знаковое число +1 в двоичном формате прибавить к -1, то должен получиться ноль (результат будет с переполнением)
+
+/- знак числа
110
-110
010
Еще пример
+
+/- знак числа
310
-310
010
И еще один пример
+
+/- знак числа
510
-510
010
5
Перевод положительного числа в отрицательное
Для того, чтобы произвести перевод положительного двоичного числа в отрицательно надо сделать следующее:
- в исходном числе меняем все нули на единицы, а единицы на нули - к младшему байту прибавляем 1
Например возьмем положительное двоичное число 01012 (510) и сделаем из него отрицательное - меняем единицы на нули и нули на единицы: 10102 - прибавляем единицу к младшему разряду: 10112
Если мы говорим о двоичном числе СО ЗНАКОМ (у которого старший разряд является показателем знака: 0 - положительное число, 1 - отрицательное) то полученный результат будет соответствовать -5 в десятичной системе счисления
Возьмем 01102 (610) и тоже поменяем ему знак: - меняем единицы на нули и нули на единицы: 10012 - прибавляем единицу к младшему разряду: 10102 (-610)
6
Вычитание двоичных чисел (столбиком)
Помните как мы производим вычитание чисел столбиком в нашей привычной десятичной системе счисления?
Вычитание десятичных чисел Вычтем из десятичного числа 10080 число 1901 10080 - 1901 = 8179
Красным цветом выделены разряды числа
-
10080 - 1901 = 8179
Вычитание двоичных чисел
Для вычитания столбиком двоичных чисел действуют те же самые правила, только в качестве заемного числа выступает число 2, а не 10, поскольку мы оперируем значением двоичной системы счисления - 2
Правила вычитания те же: 0 - 0 = 0 0 - 1 = 1 и занимает разряд из старшего бита 1 - 0 = 1 1 - 1 = 0
Вычитаем:
1101110 (десятичное 110)
- 10111 (десятичное 23)
=1010111 (десятичное 87)
Принцип вычитания следующий:
-
( 11010 )
( 2310 )
Разберем процесс вычитания подробнее Номера битов указаны красным цветом для наглядности
Разбор находится под катом...
Проверьте в Терминале его десятичное значение:
0b110111
Получается 87, что соответствует действительности: 110 - 23 = 87
Еще несколько примеров вычитания двоичных чисел:
В круглых скобках даны эквиваленты в десятичном формате