Оператор >>
не является циклическим сдвигом - он полностью отбрасывает значения, сдвинутые за пределы младшего бита, вместо перехода к MSB:
>>> bin(51)[2:].zfill(6)
'110011'
>>> bin(51 >> 3)[2:].zfill(6)
'000110'
Ваша идея использовать второй операнд по модулюдлина бита первого операнда находится на правильном пути, но вам потребуется выполнить некоторые дополнительные операции для восстановления этих отброшенных битов.
def cshift_right(num, dist):
v1 = num >> (dist % 16) # this is your original logic
v2 = (num << (16 - dist % 16)) & 0xFFFF # shift left, and mask off higher bits
return v1 | v2 # combine the two results
Проверка того, что это работает:
>>> bin(51)[2:].zfill(16)
'0000000000110011'
>>> bin(cshift_left(51, 3))[2:].zfill(16)
'0110000000000110'