模运算和与运算的一点儿简单思考
用与运算等价替换模运算的场景还挺多的,原因之一就是与运算效率比模运算高。能够等价替换的前提条件:要模的值是 2 的整数次幂。
等价公式是这样的:num % = num &
比如:num % 64 = num & 63
只要记住这个公式就可以明白为什么 HashMap 桶的长度是 2 的整数次幂,为什么在 BitMap 中会出现 &63 的表达式,
也可以理解将一个无符号数截断位 w 位等价于计算该值模
但是为了领略位运算的精妙之处,所以把这个公式的原理梳理一下。
比如当 n=6 时 值是 64, 对应的二进制代码为 1 0 0 0 0 0 0, 当 num = 76 时 对应的二进制代码为:1 0 0 1 1 0 0
模就等于除取余,余数 = 小于第 n 位的二进制数的和 因为余数只能在第 n 位的右边,接下来就是如何确定右边的数到底是多少,63 的二进制代码是:1 1 1 1 1 1,与上 num 就能确认第 0 位到第 n-1 位的值是多少
先简单记录一下吧,感觉也没什么可写的的了
版权声明: 本文为 InfoQ 作者【LSJ】的原创文章。
原文链接:【http://xie.infoq.cn/article/89a6a7a1606ee28c72d7118d4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论