Bit shifting
- Related pages
The operators #
Operator | Meaning |
---|---|
>> | Arithmetic (signed) right shift operator |
>>> | Logical (unsigned) right shift operator |
<< | Left shift operator, meets the needs of logical and arithmetic shifts |
Left shift <<
#
Integers are stored, in memory, as a series of bits. For example, the number 6
is:
6 0000 0110 0x6
Shifting the bit pattern to 1
(6 << 1
) results in 12
6 0000 0110 0x6
<<1 12 0000 1100 0xc
Shifting the bit pattern to 2
(6 << 2
) results in 24
6 0000 0110 0x6
<<2 24 0001 1000 0x18
Shifting left is equivalent to multiplication by powers of 2
dec(6 << 1) = 6 * 2
dec(6 << 3) = 6 * 8
When shifting left, the most-significant bit is lost, and 0 bit is inserted on the other end.
print(bin(0b010 << 1))
print(bin(0b010 << 2))
print(bin(0b010 << 3))
print(int(0b010 << 1))
print(int(0b010 << 2))
print(int(0b010 << 3))
0b100
0b1000
0b10000
4
8
16
Logical right shift >>>
#
Logical right shift is the converse of the left shift, instead of multiplication
by powers of 2
, we divide by powers of 2
.
Rather than moving bits to the left, they move right.
Shifting the bit pattern 12 >>> 1
gives 6
back
12 0000 1100 0xc
>>>1 6 0000 0110 0x6
Arithmetic right shift >>
#
The arithmetic right shift, is exactly the same as the Logical right shift,
except instead of padding with 0
it pads with the most significant bit.
The most significant bit is the sign-bit, or the bit on which distinguishes
positive and negative numbers. By padding with the most significant bit, the
arithmetic right shift is sign-preserving.
For example, shifting -8 >> 2
-8 11111 1111 1111 1111 1111 1111 1111 000 -0x8
>>2 -2 11111 1111 1111 1111 1111 1111 1111 110 -0x2
print(bin(0b010 >> 1))
print(bin(0b010 >> 2))
print(bin(0b010 >> 3))
print(bin(0b1011 >> 1))
print(bin(0b1011 >> 3))
print(int(0b010 >> 1))
print(int(0b010 >> 2))
print(int(0b010 >> 3))
print(int(0b1011 >> 1))
print(int(0b1011 >> 3))
0b1
0b0
0b0
0b101
0b1
1
0
0
5
1
For numbers >= 0 (positive numbers), a single shift divides a number by 2, removing any remainders.
print(bin(0b101 >> 1))
print(int(0b101 >> 1))
0b10
2