2013年6月19日 星期三

C 語言的 Bit Rotate

寫 C/C++ 的人, 應該都知道 bit shift 怎麼用。 如果想要將一個 Byte 的資料, 往左 shift 5 個位元, 很容易用以下程式碼就可以做到了。

int a = 45; // 45 = 二進位00101101
a = a << 5; // shift 後變成 10100000, 左邊的5個 bit 移出了, 右邊補進5個0
            // a 的值變成 160


但是有時候, 我們並不是要 bit shift, 而要 bit rotate。也就是說從 MSB shift 出去的 bit, 再從 LSM shift 回來。 
但 C/C++ 並沒有提供這種 bit rotate 的 bitwise operaton 操作, 但 bit rotate 在密碼學中常常用到, 因此在網路上找到 bit rotate 寫法, 並稍微修改了一下, 其實還滿簡單的, 以下的 code 就可以做到了。

unsigned char bit_rotate_left(int shift, unsigned char value)
{
   return (value << shift) | (value >> (sizeof(char)*8 - shift));
}



使用 45 (00101101) 向左 rotate 5 個 bit 的運作範例, 向右 rotate 也是如法炮制, 就不在特別說明了。