个人理解 除数为2^n 的取余 和 运算符& 的关系

关于一条吊炸天的计算式  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 多尝试几下。

看来冥冥中自有机意,机意不可违啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值