Итак, я предполагаю, что вы знаете, что такое сдвиги вправо и влево.И что вы знаете разницу между арифметическими и логическими сдвигами.
C имеет только арифметические сдвиги.Он не делает логических сдвигов и не вращается.ладно, я солгал, C делает логические сдвиги в неподписанных целых числах.
Поворот делает, ну, в точности то же самое: это то же самое, что и логический сдвиг, за исключением случаев, когда вы сдвигаетесь после конца числа, перенос цифр "вокруг "на другую сторону.Например,
0010
с правым поворотом - 0001
.Если вы снова поверните вправо, вы получите 1000
.См. 1
, обернутый или повернутый к другой стороне целого числа.
Поворот влево аналогичен: 0100
Поворот влево 1000
Поворот влево 0001
Поворот влево 0010
и т. д.
Обратите внимание, что при вращении не сохраняется знаковый бит, как при арифметическом сдвиге вправо.
Таким образом, C имеет только арифметические сдвиги.Таким образом, вы должны реализовать «вращать» часть вручную.Итак, поверните налево.Вы хотели бы:
- Захватить значение самого левого бита.(это 0 или 1?)
- Сделать сдвиг влево
- Установить самый правый бит - это тот бит, о котором мы говорили в шаге 1 (который нужно вращать вокруг) к правильному значению, основанному на том, что мы зафиксировали на шаге 1.
Вы должны быть в состоянии найти аналогичный метод для правого поворота.
удачи!