关于一条吊炸天的计算式 X % 2^n = X & (2^n - 1)
众所周知,十进制在计算机里,就是010101......(以前还纳闷深圳高新园的立交桥的护栏为啥是01010110010)
扯远了......

假如 X = 11,n = 3,
余数 = 11 % 2^3,余数 = 3
但 % 毕竟是人类的思维方式,在计算机里是比较影响效率。
不过脑力有限,我就先把所有的数字转为二进制,好吧?
余数 = 1011 % 1000 ,余数 = 0011
这东西,似曾相识,在位运算符&里,是可以实现的。(请自行参照运算符&,移位运算<< 等资料)
1011 & xxxx = 0011?列得直观点: 1011
xxxx
0011
诶,此时xxxx 有两种可能 0011 和 0111 ,额?
0011怎么来?一脸懵逼哦

那0111呢?
别说,还真get到了。
2的n次幂转换为二进制时,有个规律,如2^1 = 10(二进制),2^2 = 100(二进制),以此类推:2^n
就是1后面跟着n个0。2^3 = 8 = 1000(二进制),1000 能不能转换 为0111呢?发现二进制计算减法:1000 减1就可以得到0111。xxxx 就是 1000 – 1 也就是 2^3 – 1。
哇,原来xxxx 你这dog sun的是这样玩的啊?

这还得亏了2^n 的二进制规律,我私下再改变X 和n 多尝试几下。
看来冥冥中自有机意,机意不可违啊! |