Объяснение поворота влево в C

Мне нужна помощь в понимании языка C. Я только начал. У меня есть этот фрагмент кода из википедии:

unsigned int rotl(unsigned int value, int shift) {
     return (value << shift) | (value >> (sizeof(value) * CHAR_BIT - shift));
}

Я понимаю, что означает вращение битов. Я просто не понимаю эту реализацию. Почему я должен выполнять здесь оператор ИЛИ? И что на самом деле делает правая часть?

Я сдвигаю значение вправо на количество байтов, умноженное на значение (количество битов в переменной char минус сдвиг, который я хочу). Почему я должен это делать? Если я придумаю пример. Я хочу сдвинуть без знака 1011 (Base 2) 2 бита влево. Я делаю то, что говорит код:

0000 0000 0000 0000 0000 0000 0000 1011 << 2 = 0000 0000 0000 0000 0000 0000 0010 1100

1011 >> (4*(8-2))=24 = 0000 0000 0000 0000 0000 0000 0000 0000 0000;

выполнить |: = 0000 0000 0000 0000 0000 0000 0010 1100.

Хорошо, это не сработало. Что я делаю неправильно?

Спасибо!


person RunOrVeith    schedule 01.05.2014    source источник
comment
Вы неправильно расставили скобки: 4 * (8 - 2) должно быть 4*8 - 2. Кроме того, почему это не сработало? Ваш результат правильный. Правая смена просто не способствовала вашей операции.   -  person M Oehm    schedule 01.05.2014
comment
Но я хочу повернуть влево, а не сдвинуть влево. Разве это не должно быть 1011 leftrot(2) = 1110 ? Или я неправильно понял концепцию вращения, и это происходит только тогда, когда вращается что-то вроде 1000 0000 0000 0000 1001 0000 1010 1100?   -  person RunOrVeith    schedule 01.05.2014
comment
Но ты делаешь это! Сдвиг означает, что биты выталкиваются с левого конца. Вращение означает, что они снова появляются справа. В вашем примере нет старших битов, которые могли бы появиться, а 0x1011 >> 30 равно нулю. Выберите число со старшими битами или поверните 0x1011 на 30 бит.   -  person M Oehm    schedule 01.05.2014
comment
Итак, если бы 1011 было сохранено в 4-битном формате, а не в 32-м, и я сдвину его на 2 влево, я бы получил 1110?   -  person RunOrVeith    schedule 01.05.2014
comment
Да, 4-битное число 1011 станет 1110. Представьте, что ваше двоичное число — круговое. Вращение просто изменяет начальную точку, а не битовый шаблон.   -  person M Oehm    schedule 01.05.2014
comment
Хорошо, я думаю, что понял это сейчас. Спасибо   -  person RunOrVeith    schedule 01.05.2014


Ответы (1)


Вот графическое определение 8-битного «Сдвиг влево» и «Поворот влево»:

введите здесь описание изображения

"Why do I have to perform the OR operator here?" 
"And what does the right part actually do?"

Для операции «повернуть влево» биты, которые «выпадают» из левой стороны, перерабатываются, так как они объединяются «ИЛИ» обратно в правую сторону.

person Mahonri Moriancumer    schedule 01.05.2014