'How to fix bit length when doing bitshift right?

I have generated x = 0 - 2047 in hexadecimal (0 - 7ff). Then, I tried to shift one bit to right, but I want to keep all the value.

for example, for x = 2047 = h7ff. I want to shift this value to right. can I set fixed bit length, so that even if I shift, it will not cut the 8?

tried:

x = 2047

hex(x)='0x7ff'

hex(x >> 1)='0x3ff'

expecting:

0x3ff8


Solution 1:[1]

If you want to add extra digit only if a bit in the result will be chopped off, you can use a simple modulo. Check if the last bit in the value is a 1, and if it is, multiply the number by 0x10 or decimal 16 to add the extra padding. Then bit shift as normal.

hex((x * 0x10 if x % 2 == 1 else x) >> 1)

adding this to a method for reuse:

def rotate(x):
    return (x * 0x10 if x % 2 == 1 else x) >> 1


print(hex(x := 0x7ff))
print(hex(x := rotate(x)))
print(hex(x := rotate(x)))
print(hex(x := rotate(x)))
print(hex(x := rotate(x)))
0x7ff
0x3ff8
0x1ffc
0xffe
0x7ff

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1