位元運算
by music960633
課程內容 課程內容
• 1. 位元運算子
• 2. 位元運算應用
課程內容 課程內容
• 1. 位元運算子
• 2. 位元運算應用
位元運算子 位元運算子
• 常見的整數運算
• + - * / % ...
• 以 int 為例,將 32 個位元視為一個數字做運算
• 0001101111010010(2) = 0x1bd2(16) = 7122(10)
• 位元運算
• & | ^ ~ << >>
• 將每個位元視為獨立,個別運算
位元運算子 位元運算子
• 以下將一一介紹以下位元運算子
• & : AND
• | : OR
• ^ : XOR
• ~ : NOT
• << : left shift
• >> : right shift
位元運算子 – &
位元運算子 – &
• & : AND
• ex: 1010 & 0110 = 0010
& 0 1
0 0 0
1 0 1
位元運算子 – | 位元運算子 – |
• | : OR
• ex: 1010 | 0110 = 1110
| 0 1
0 0 1
1 1 1
位元運算子 – ^ 位元運算子 – ^
• ^ : XOR
• ex: 1010 ^ 0110 = 1100
^ 0 1
0 0 1
1 1 0
位元運算子 – ~ 位元運算子 – ~
• ~ : NOT
• ex: ~1010 = 0101
~ 0 1
1 0
位元運算子 – <<
位元運算子 – <<
• << : left shift
• 所有位元往左 (MSB) 移動 k 格,超出範圍直接無視,並在最右 端 (LSB) 補上 k 個 0
• ex: 1011 << 2 = 1100
位元運算子 – >>
位元運算子 – >>
• << : right shift
• 所有位元往右 (LSB) 移動 k 格,超出範圍直接無視,並在最左 端 (MSB) 補上 k 個 0
• ex: 1011 >> 2 = 0010
課程內容 課程內容
• 1. 位元運算子
• 2. 位元運算應用
位元運算應用 位元運算應用
• 乘除 2n
• 表示集合
• 枚舉
• 黑魔法
位元運算應用 – 乘除 2
n位元運算應用 – 乘除 2
n• 左移右移可視為乘 / 除 2 的冪次
• a << n = a * 2n ( 不考慮 overflow)
• a >> n = a / 2n ( 無條件捨去 )
位元運算應用 – 表示集合 位元運算應用 – 表示集合
• 將一個 unsigned 視為有 32 個元素的集合
• 00110101 = {0,2,4,5}
• 位元運算視為集合運算
• &: 交集 (intersection)
• |: 聯集 (union)
• ^: 對稱差 (symmetric difference)
• ~: 補集 (complement)
• ex: {0,2,4,5} ∩ {2,3,5,7} = {2,5}
• 00110101 & 10101100 = 00100100
位元運算應用 – 表示集合 位元運算應用 – 表示集合
• 空集合: 0
• 宇集合: (1<<n)-1 = 111...111
• 集合 S 加入第 k 個元素
• S = S | (1<<k)
• 集合 S 刪除第 k 個元素
• S = S & ~(1<<k)
• 集合內是否有第 k 個元素
• S & (1<<k) != 0
• (S>>k) & 1 != 0
位元運算應用 – 枚舉 位元運算應用 – 枚舉
• 題目:枚舉 N 個物品要取不取的所有可能
• Input
• N=3
• Output
• 000 001 010 011 100 101 110 111
位元運算應用 – 枚舉 位元運算應用 – 枚舉
• 題目:枚舉 N 個物品要取不取的所有可能
• 簡單,使用 DFS !
位元運算應用 – 枚舉 位元運算應用 – 枚舉
• 題目:枚舉 N 個物品要取不取的所有可能
• 將每個位置取或不取視為 0/1 ,則所有可能形成的二進位數字恰 好是 0 到 2n-1 !
• 令一個變數 s 由 0 跑到 2n-1 ,再將 s 的二進位輸出即可
!
位元運算應用 – 黑魔法 位元運算應用 – 黑魔法
• Three value logic
• True(T)/False(F)/Unknown(X)
• How to implement?
& T F X
T T F X
F F F F
X X F X
位元運算應用 – 黑魔法 位元運算應用 – 黑魔法
• True = 0, False = 1, Unknown = 2
• 一堆 if 覺得不是很簡潔
位元運算應用 – 黑魔法 位元運算應用 – 黑魔法
• True = 0, False = 1, Unknown = 2
• 多使用了 9*4 byte 的記憶體
位元運算應用 – 黑魔法 位元運算應用 – 黑魔法
• True = 0, False = 1, Unknown = 2
• In MiniSat
• What the hell is this!!