Операции сдвига выполняются с использованием регистра центрального процессора. Регистр состоит из нескольких бит (8, 16 и 32 являются общими, и у вас есть 32 CPU), которые в комбинации можно интерпретировать как десятичное значение.
В вашем примере используется значение 1. Язык C позволяет ценностному быть представлены несколькими способами, все из которых приводят к тем же содержанием регистра процессора:
decimal hexadecimal binary
1 0x00000001 0b00000000000000000000000000000001
3713883835 0xDD5D5EBB 0b11011101010111010101111010111011
(Во всех делающие ведущие 0
s могут быть опущены.)
В двоичном представлении указываются все значения битов регистра CPU. Как вы можете видеть, это включает 0 и 1 сек. Поэтому, когда вы поместите значение 1 в регистр и выполните сдвиг влево с помощью оператора <<
, содержимое всего регистра будет сдвинуто налево на один бит, а 0 будет помещено в младший значащий бит.
В своем коде значение, присвоенное данным будет следовать этой схеме:
i = 0, data = 0x00000000000000000000000000000001
i = 1, data = 0x00000000000000000000000000000010
i = 2, data = 0x00000000000000000000000000000100
etc.
i = 30, data = 0x01000000000000000000000000000000
i = 31, data = 0x10000000000000000000000000000000
Если вы использовали другое значение, чем 1 сдвиг, вы бы, конечно, в конечном итоге с другим рисунком, но это будет следовать тем же правилам. То есть все биты сдвигаются, независимо от того, имеют ли они 1 или 0.
for(i=0;i<32;i++)
{
data = (165 << i) // 165 = 0xA5 = 0b10100101
}
Produces:
i = 0, data = 0x00000000000000000000000010100101
i = 1, data = 0x00000000000000000000000101001010
i = 2, data = 0x00000000000000000000001010010100
etc.
i = 28, data = 0x10100000000000000000000000000000
i = 29, data = 0x01000000000000000000000000000000
i = 30, data = 0x10000000000000000000000000000000
i = 31, data = 0x00000000000000000000000000000000
Обратите внимание, как картина исчезает к концу, как самые старшие биты сдвигаются из регистра.
Те же правила справедливы для выполнения сдвигов вправо с использованием оператора >>
, за исключением того, что бит перемещается от наиболее значимого к наименее значащему.
(Некоторые процессоры также Rotate и другие замечательные инструкции немного манипуляции.)
Сдвиг «сдвига» как нули и единицы. –
Прежде всего, оператор '<' является оператором меньше, чем сравнение. Во-вторых, если вы хотите * очистить * биты, используйте побитовые операторы AND ('&') и дополнения ('' '). –
зачем снимать? Я просто маскирую (проверяю) необходимые биты и сохраняю их в новой переменной с помощью оператора сдвига – Lazar