僅適用於整數與字元型別 (及其變體),對浮點數無效。結果可為 0/1 以外值,區別於邏輯運算。
| 運算子 | 名稱 | 功能 | 範例 (x=7=0111, y=8=1000) |
|---|---|---|---|
& | 位元 AND | 對應位皆 1 才為 1 | x & y = 0 |
| | 位元 OR | 對應位任一 1 即為 1 | x | y = 15 (1111) |
^ | 位元 XOR | 對應位不同為 1 | x ^ y = 15 |
~ | 位元 NOT (補數) | 逐位翻轉 | ~x = ...11111000 (-8) |
<< | 左移 | 低位補 0,高位捨棄 | x << 1 = 14 (1110) |
>> | 右移 | 無號補 0,有號實作定義 (通常算術右移複製符號位) | x >> 1 = 3 (0011) |
int x = 7;
x && 8 == 1 /* 邏輯與:非零且非零 → 真 (1) */
x & 8 == 0 /* 位元與:0111 & 1000 = 0000 */
x << 32 在 32-bit int 未定義。char c; c << 2 中 c 先提升為 int 再移位。標準庫無內建,需自行組合:
/* 32-bit 無號整數循環左移 n 位 (0 < n < 32) */
uint32_t rotl32(uint32_t x, int n)
{
return (x << n) | (x >> (32 - n));
}
/* 循環右移 */
uint32_t rotr32(uint32_t x, int n)
{
return (x >> n) | (x << (32 - n));
}
/* 通用巨集 (需自行確保 0 < n < N) */
#define ROL(x, n, N) (((x) << (n)) | ((x) >> ((N) - (n))))
#define ROR(x, n, N) (((x) >> (n)) | ((x) << ((N) - (n))))
| 編譯器 | 內建函數 | 標頭檔 |
|---|---|---|
| GCC/Clang | __builtin_rotateleft32, __builtin_rotateright32 | 無需 |
| MSVC | _rotl, _rotr | |
flags |= MASK; flags &= ~MASK; flags ^= MASK;x << 3 (×8), x >> 2 (÷4)。(x << 24) | ((x << 8) & 0xFF0000) | ((x >> 8) & 0xFF00) | (x >> 24)。REG |= (1 << BIT); 設定位,REG &= ~(1 << BIT); 清除位。& (位元和) 與 && (邏輯與)。~x + 1 == -x 適用於無號數 (會溢位)。