理解 DAX 位運算
PowerBI 十月更新已到,其中最重要的莫過于,再次增強(qiáng)了 DAX 的能力,為 DAX 帶來了位移運算。
理解什么是位
數(shù)字在計算機(jī)中的存儲是放在內(nèi)存小格子中的,如下:

而且只有兩種可能,要么是 0 ,要么是 1。
對于一個一般的數(shù)字,則是這樣的,例如:數(shù)字 7 的表示如下:

從右向左,依次表示:1 + 2^1^ + 2^2^ = 7 ,這就是 7 這個數(shù)字在計算機(jī)內(nèi)存的小格子中的真實表示。
DAX 現(xiàn)在通過位運算函數(shù)可以對格子中的內(nèi)容進(jìn)行調(diào)整,就是位運算。
向左移動
對于數(shù)字 7,如下:

向右移動 1 位,則有:

表示:
0 + 2^1^ + 2^2^ + 2^3^ = 14
用 DAX 函數(shù)驗證如下:
BIT.LeftShift = BITLSHIFT( 7 , 1 )結(jié)果如下:

向右移動
對于數(shù)字 7,如下:

向右移動 1 位,則有:

表示:
1 + 2^1^ = 3
用 DAX 函數(shù)驗證如下:
BIT.RightShift = BITRSHIFT( 7 , 1 )結(jié)果如下:

注意,由于向右移動時,最右端的 1 已經(jīng)不在當(dāng)前存放區(qū)域,因此,會忽略它的計算。
按位與運算
按位與運算表示在對應(yīng)的位上,如果都是 1 則返回 1,否則返回 0,例如:

數(shù)字 3 和 數(shù)字 7 的按位與運算的結(jié)果是 3。
用 DAX 函數(shù)驗證如下:
BIT.AND = BITAND( 7 , 3 )結(jié)果如下:

按位或運算
按位與運算表示在對應(yīng)的位上,只要有 1 則返回 1,全部為 0 才返回 0,例如:

數(shù)字 3 和 數(shù)字 7 的按位或運算的結(jié)果是 7。
用 DAX 函數(shù)驗證如下:
BIT.OR = BITOR( 7 , 3 )結(jié)果如下:

按位異或運算
如果兩個值不相同,則異或結(jié)果為 1。如果 a、b 兩個值相同,異或結(jié)果為 0。例如:

數(shù)字 3 和 數(shù)字 7 的按位異或運算的結(jié)果是 4。
用 DAX 函數(shù)驗證如下:
BIT.XOR = BITXOR( 7 , 3 )結(jié)果如下:

DAX 整數(shù)的極限
通過以上內(nèi)容,來探查一下 DAX 整數(shù)范圍的極限,如下:

這很容易理解,再來看:

說明還是沒有到極限,再來看:

說明還是沒有到極限,再來看:

奇怪的現(xiàn)象來了,怎么會出現(xiàn)負(fù)數(shù)呢?
繼續(xù)看看:

似乎回到了原點了。
如果仔細(xì)思考,就可以得到這樣的結(jié)論:
DAX 的整數(shù)使用 64 位(bit)內(nèi)存小格子來裝載;
可表示的范圍是 - 2^64^ 到 2^63^ 大小,這與 DAX 官方文檔給出的標(biāo)準(zhǔn)一致;
最左端的位,同時表示符號位,因此當(dāng)移動到該位時,數(shù)字變成了負(fù)值。
總結(jié)
DAX 給出位運算是一種非常基礎(chǔ)的計算機(jī)底層運算,它實現(xiàn)了二進(jìn)制世界的關(guān)鍵數(shù)學(xué)運算,一些經(jīng)典的算法和技巧都可以通過位運算來完成,例如 MD5 散列算法等,這些對于業(yè)務(wù)人員來說似乎有些遙遠(yuǎn),不過這為專家級 BI 分析師設(shè)計新的特殊優(yōu)化算法給出了新的工具。我們會在未來的文章中給出這方面的應(yīng)用,讓大家更好的理解位運算。

Power BI 終極系列課程《BI真經(jīng)》

BI真經(jīng) - 讓數(shù)據(jù)真正成為你的力量
掃碼與精英一起討論 Power BI,驗證碼:data2021
點擊“閱讀原文”進(jìn)入學(xué)習(xí)中心
↙
