a = 01111011 循環左移 2 位b = a >> (8-2) → 取出高 2 位 00000001(即將被移出的位)。a = a << 2 → 左移得 11101100。a = a | b → 合併得 11101101(正確結果)。單行寫法:a = (a >> (8-2)) | (a << 2);
(a >> (N-n)) | (a << n)(a << (N-n)) | (a >> n)// 32 位無符號整數循環左移
uint32_t rotl32(uint32_t x, int n) {
n &= 31; // 防止 n >= 32 導致未定義行為
return (x << n) | (x >> (32 - n));
}
// 32 位無符號整數循環右移
uint32_t rotr32(uint32_t x, int n) {
n &= 31;
return (x >> n) | (x << (32 - n));
}
掌握循環移位模板,是編寫高性能系統級 C 代碼的基本功。