跳到主要內容跳到頁尾

位元運算與階梯函式:BITAND、BITOR、BITXOR、BITLSHIFT、BITRSHIFT、DELTA 與 GESTEP

5 分鐘閱讀Lv.3 中級摘要與日期

用權限旗標當例子,整理 BITAND、BITOR、BITXOR、BITLSHIFT、BITRSHIFT 五個位元運算函式,以及比較數值的 DELTA 與 GESTEP。附語法、算法與負數、小數的限制。

發布 更新

文章目錄

今天要整理 BITAND、BITOR、BITXOR、BITLSHIFT、BITRSHIFT 這組位元運算函式,再加上兩個長得像開關的 DELTA 跟 GESTEP。

坦白說,我在報表工作上幾乎沒用過位元運算。會碰到它,多半是拿到系統匯出的資料,權限欄只有一個數字,像 11,你得判斷這個人到底有沒有「寫入」的權限。這篇就用這個情境帶出來,後面當工具書查。

先看情境:一個數字裝四種權限

假設系統把四種權限各用 1 個位元記錄:讀取 = 1、寫入 = 2、刪除 = 4、管理 = 8。一個人有哪些權限,就把對應的數字加起來。

先手算:權限值 11,11 = 8 + 2 + 1,所以有管理、寫入、讀取,沒有刪除。數字小的時候心算還行,換成幾百列、八種權限就不太想算了。

在 Sheets 裡,B 欄放權限值,第 1 列放各權限的數字,判斷「有沒有」就是 BITAND:

Google 試算表公式
fx

判斷 B2 的權限值有沒有 C1 的那一種權限

=BITAND($B2, C$1) = C$1
權限值讀取(1)寫入(2)刪除(4)管理(8)
3TRUETRUEFALSEFALSE
11TRUETRUEFALSETRUE
5TRUEFALSETRUEFALSE
15TRUETRUETRUETRUE
8FALSEFALSEFALSETRUE

加權限、拿掉權限用 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 的位元才保留。

語法:

Google 試算表公式
fx

權限 11 和寫入(2) 做 AND

=BITAND(11, 2)

先手算:11 是 1011,2 是 0010,兩邊都是 1 的只有從右數第 2 位,結果是 2。結果等於 2,代表寫入權限有開。如果是 ,會得到 0。

BITOR

兩個數字的每個位元做 OR,任一邊是 1 就是 1。

語法:

幫權限 5(讀取加刪除)加上寫入:

Google 試算表公式
fx

權限 5 加上寫入(2)

=BITOR(5, 2)

結果是 7。已經有的權限再加一次也不會重複, 還是 7,這是它比直接 + 2 安全的地方。

BITXOR

兩個數字的每個位元做 XOR,兩邊不同才是 1。

語法:

Google 試算表公式
fx

把權限 7 的寫入(2) 切換一次

=BITXOR(7, 2)

7 是 0111,切換第 2 位之後是 0101,結果是 5。再切一次 又回到 7。要「拿掉」權限但不管原本有沒有,可以先 BITOR 再 BITXOR;只想拿掉已經有的,BITXOR 就夠了。

BITLSHIFT

把數字的位元整排往左移,左移一位等於乘以 2。

語法:

最常用來產生「第 n 個位元」的數字:

Google 試算表公式
fx

產生第 4 個位元的數字

=BITLSHIFT(1, 3)

1 往左移 3 位,結果是 8,也就是上面的「管理」權限。 是 52,等於 13 × 4。

BITRSHIFT

把數字的位元整排往右移,右移一位等於除以 2 再捨去小數。

語法:

Google 試算表公式
fx

權限 11 右移 1 位

=BITRSHIFT(11, 1)

11 是 1011,右移一位變成 101,結果是 5。 是 12(100 ÷ 8 = 12.5,捨去小數)。

右移加 BITAND 可以取出單一位元: 得 1,代表第 4 位(管理)是開的。

位移的結果超過上限、或位移位數大到不合理時,會得到 #NUM!,例如 。位移位數給負數,會變成反方向位移, 是 16。

比較與階梯

DELTA

比較兩個數值,相等回 1,不相等回 0。

語法:

  • 數值2:選填,省略時當作 0。
Google 試算表公式
fx

5 和 5 相等嗎

=DELTA(5, 5)

結果是 1, 是 0。因為結果是 1 或 0,可以直接 SUM 起來數有幾組相等,不過我自己會用 搭配 COUNTIF,DELTA 只有在要把結果直接拿去乘東西時才比較方便。

GESTEP

數值大於或等於門檻回 1,否則回 0。GE 是 Greater or Equal。

語法:

  • 門檻:選填,省略時用 0,所以 是 0、 是 1。

舉例,成績 59 分、門檻 60:

Google 試算表公式
fx

59 分有沒有達到 60 分

=GESTEP(59, 60)

結果是 0, 是 1。算及格人數,可以把整欄丟進去:

Google 試算表公式
fx

數出 A2:A6 有幾人達到 60 分

=SUMPRODUCT(GESTEP(A2:A6, 60))

A2:A6 是 59、60、72、45、88 的話,結果是 3。

簡單來說,這組函式我當小知識放著,遇到權限旗標或需要 1 和 0 的場合再回來查。

分享:
#位元運算#BITAND#權限旗標#工程函式
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

八年工作經驗,跨不同業界解決數據需求。做過的案例都整理在作品集。

接下來可以

相關文章

查看所有文章

留言討論

共 0 則留言

訂閱電子報,新文章上線就通知你

免費,隨時可取消。

送出即表示同意服務條款與隱私權政策。