(предупреждение для будущих читателей): код Википедии создает субоптимальный asm (gcc включает ветку или cmov). См. Лучшие практики для операций кругового сдвига (поворота) в C ++ для эффективного вращения без UB.
Из Википедии :
unsigned int _rotl(unsigned int value, int shift) {
if ((shift &= 31) == 0)
return value;
return (value << shift) | (value >> (32 - shift));
}
unsigned int _rotr(unsigned int value, int shift) {
if ((shift &= 31) == 0)
return value;
return (value >> shift) | (value << (32 - shift));
}