理解 DAX 位运算

PowerBI战友联盟

共 1406字,需浏览 3分钟

 · 2021-10-18

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

点击“阅读原文”进入学习中心


浏览 18
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报