理解 DAX 位运算
PowerBI 十月更新已到,其中最重要的莫过于,再次增强了 DAX 的能力,为 DAX 带来了位移运算。
理解什么是位
数字在计算机中的存储是放在内存小格子中的,如下:
而且只有两种可能,要么是 0 ,要么是 1。
对于一个一般的数字,则是这样的,例如:数字 7 的表示如下:
从右向左,依次表示:1 + 2^1^ + 2^2^ = 7 ,这就是 7 这个数字在计算机内存的小格子中的真实表示。
DAX 现在通过位运算函数可以对格子中的内容进行调整,就是位运算。
向左移动
对于数字 7,如下:
向右移动 1 位,则有:
表示:
0 + 2^1^ + 2^2^ + 2^3^ = 14
用 DAX 函数验证如下:
BIT.LeftShift = BITLSHIFT( 7 , 1 )
结果如下:
向右移动
对于数字 7,如下:
向右移动 1 位,则有:
表示:
1 + 2^1^ = 3
用 DAX 函数验证如下:
BIT.RightShift = BITRSHIFT( 7 , 1 )
结果如下:
注意,由于向右移动时,最右端的 1 已经不在当前存放区域,因此,会忽略它的计算。
按位与运算
按位与运算表示在对应的位上,如果都是 1 则返回 1,否则返回 0,例如:
数字 3 和 数字 7 的按位与运算的结果是 3。
用 DAX 函数验证如下:
BIT.AND = BITAND( 7 , 3 )
结果如下:
按位或运算
按位与运算表示在对应的位上,只要有 1 则返回 1,全部为 0 才返回 0,例如:
数字 3 和 数字 7 的按位或运算的结果是 7。
用 DAX 函数验证如下:
BIT.OR = BITOR( 7 , 3 )
结果如下:
按位异或运算
如果两个值不相同,则异或结果为 1。如果 a、b 两个值相同,异或结果为 0。例如:
数字 3 和 数字 7 的按位异或运算的结果是 4。
用 DAX 函数验证如下:
BIT.XOR = BITXOR( 7 , 3 )
结果如下:
DAX 整数的极限
通过以上内容,来探查一下 DAX 整数范围的极限,如下:
这很容易理解,再来看:
说明还是没有到极限,再来看:
说明还是没有到极限,再来看:
奇怪的现象来了,怎么会出现负数呢?
继续看看:
似乎回到了原点了。
如果仔细思考,就可以得到这样的结论:
DAX 的整数使用 64 位(bit)内存小格子来装载;
可表示的范围是 - 2^64^ 到 2^63^ 大小,这与 DAX 官方文档给出的标准一致;
最左端的位,同时表示符号位,因此当移动到该位时,数字变成了负值。
总结
DAX 给出位运算是一种非常基础的计算机底层运算,它实现了二进制世界的关键数学运算,一些经典的算法和技巧都可以通过位运算来完成,例如 MD5 散列算法等,这些对于业务人员来说似乎有些遥远,不过这为专家级 BI 分析师设计新的特殊优化算法给出了新的工具。我们会在未来的文章中给出这方面的应用,让大家更好的理解位运算。
Power BI 终极系列课程《BI真经》
BI真经 - 让数据真正成为你的力量
扫码与精英一起讨论 Power BI,验证码:data2021
点击“阅读原文”进入学习中心
↙