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 也是如法炮制, 就不在特別說明了。 |
作者已經移除這則留言。
回覆刪除Sizeof(char)*8
回覆刪除為什麼要"*8" ?
一個位元組有8個位元
刪除作者已經移除這則留言。
回覆刪除