今天要整理 BITAND、BITOR、BITXOR、BITLSHIFT、BITRSHIFT 這組位元運算函式,再加上兩個長得像開關的 DELTA 跟 GESTEP。
坦白說,我在報表工作上幾乎沒用過位元運算。會碰到它,多半是拿到系統匯出的資料,權限欄只有一個數字,像 11,你得判斷這個人到底有沒有「寫入」的權限。這篇就用這個情境帶出來,後面當工具書查。
先看情境:一個數字裝四種權限
假設系統把四種權限各用 1 個位元記錄:讀取 = 1、寫入 = 2、刪除 = 4、管理 = 8。一個人有哪些權限,就把對應的數字加起來。
先手算:權限值 11,11 = 8 + 2 + 1,所以有管理、寫入、讀取,沒有刪除。數字小的時候心算還行,換成幾百列、八種權限就不太想算了。
在 Sheets 裡,B 欄放權限值,第 1 列放各權限的數字,判斷「有沒有」就是 BITAND:
判斷 B2 的權限值有沒有 C1 的那一種權限
=BITAND($B2, C$1) = C$1| 權限值 | 讀取(1) | 寫入(2) | 刪除(4) | 管理(8) |
|---|---|---|---|---|
| 3 | TRUE | TRUE | FALSE | FALSE |
| 11 | TRUE | TRUE | FALSE | TRUE |
| 5 | TRUE | FALSE | TRUE | FALSE |
| 15 | TRUE | TRUE | TRUE | TRUE |
| 8 | FALSE | FALSE | FALSE | TRUE |
加權限、拿掉權限用 BITOR 跟 BITXOR,後面各函式會講到。
怎麼選
| 想做的事 | 用哪個 | 重點 |
|---|---|---|
| 檢查某個位元有沒有開 | BITAND | 兩邊都是 1 才得 1 |
| 把某個位元打開 | BITOR | 只要一邊是 1 就得 1 |
| 切換(開變關、關變開) | BITXOR | 兩邊不同才得 1 |
| 位元整排往左、右移 | BITLSHIFT、BITRSHIFT | 左移一位等於乘 2 |
| 兩個數是否相等 | DELTA | 相等 1,不相等 0 |
| 數字有沒有達到門檻 | GESTEP | 大於等於門檻 1,否則 0 |
位元函式的輸入要是非負整數,負數或小數會得到 #NUM!;數值上限是 2^48-1(281474976710655),超過也是 #NUM!。Excel 2013 以上也有 BITAND、BITOR、BITXOR、BITLSHIFT、BITRSHIFT,DELTA、GESTEP 也有,用法相同,上限也一樣。想看十進位的二進位長相,可以搭配 進位轉換函式 的 DEC2BIN。
位元運算
BITAND
兩個數字的每個位元做 AND,兩邊都是 1 的位元才保留。
語法:
權限 11 和寫入(2) 做 AND
=BITAND(11, 2)先手算:11 是 1011,2 是 0010,兩邊都是 1 的只有從右數第 2 位,結果是 2。結果等於 2,代表寫入權限有開。如果是 ,會得到 0。
BITOR
兩個數字的每個位元做 OR,任一邊是 1 就是 1。
語法:
幫權限 5(讀取加刪除)加上寫入:
權限 5 加上寫入(2)
=BITOR(5, 2)結果是 7。已經有的權限再加一次也不會重複, 還是 7,這是它比直接 + 2 安全的地方。
BITXOR
兩個數字的每個位元做 XOR,兩邊不同才是 1。
語法:
把權限 7 的寫入(2) 切換一次
=BITXOR(7, 2)7 是 0111,切換第 2 位之後是 0101,結果是 5。再切一次 又回到 7。要「拿掉」權限但不管原本有沒有,可以先 BITOR 再 BITXOR;只想拿掉已經有的,BITXOR 就夠了。
BITLSHIFT
把數字的位元整排往左移,左移一位等於乘以 2。
語法:
最常用來產生「第 n 個位元」的數字:
產生第 4 個位元的數字
=BITLSHIFT(1, 3)1 往左移 3 位,結果是 8,也就是上面的「管理」權限。 是 52,等於 13 × 4。
BITRSHIFT
把數字的位元整排往右移,右移一位等於除以 2 再捨去小數。
語法:
權限 11 右移 1 位
=BITRSHIFT(11, 1)11 是 1011,右移一位變成 101,結果是 5。 是 12(100 ÷ 8 = 12.5,捨去小數)。
右移加 BITAND 可以取出單一位元: 得 1,代表第 4 位(管理)是開的。
位移的結果超過上限、或位移位數大到不合理時,會得到 #NUM!,例如 。位移位數給負數,會變成反方向位移, 是 16。
比較與階梯
DELTA
比較兩個數值,相等回 1,不相等回 0。
語法:
- 數值2:選填,省略時當作 0。
5 和 5 相等嗎
=DELTA(5, 5)結果是 1, 是 0。因為結果是 1 或 0,可以直接 SUM 起來數有幾組相等,不過我自己會用 搭配 COUNTIF,DELTA 只有在要把結果直接拿去乘東西時才比較方便。
GESTEP
數值大於或等於門檻回 1,否則回 0。GE 是 Greater or Equal。
語法:
- 門檻:選填,省略時用 0,所以 是 0、 是 1。
舉例,成績 59 分、門檻 60:
59 分有沒有達到 60 分
=GESTEP(59, 60)結果是 0, 是 1。算及格人數,可以把整欄丟進去:
數出 A2:A6 有幾人達到 60 分
=SUMPRODUCT(GESTEP(A2:A6, 60))A2:A6 是 59、60、72、45、88 的話,結果是 3。
簡單來說,這組函式我當小知識放著,遇到權限旗標或需要 1 和 0 的場合再回來查。
接下來可以
相關文章
查看所有文章數學基礎函式:MOD、ABS、POWER、SQRT、SIGN、PRODUCT、ISEVEN 與 ISODD
整理 MOD 餘數(含負數與除以 0)、ABS 絕對值、POWER 與 ^ 次方、SQRT 開根號、SIGN 正負號、PRODUCT 連乘、ISEVEN 與 ISODD 奇偶判斷的語法與例子,並附隔列標記、時間換算、誤差總和、兩點距離與連續成長率的實例。
複數的指數、對數與次方:極座標相量、特性阻抗與 IMEXP、IMLN、IMSQRT
把極座標的相量換成直角座標要用 IMEXP,取對數用 IMLN、IMLOG、IMLOG10、IMLOG2,次方與開根號用 IMPOWER 和 IMSQRT。附 10 V 相量轉換與特性阻抗的算例,也講浮點誤差的小地雷。
留言討論
共 0 則留言
