取余与位运算

来源:互联网 发布:傲飞数据整合工具 编辑:程序博客网 时间:2024/05/16 01:23

最近研究别人的代码,其中一段怎么也想不明白~后来按自己的意思写了一遍,发现自己用的是取余,别人用的是&位运算,后来估计取余可以用位运算来表示,网上一搜还真有,对比一下,原代码果然也是此意~

=====================================================================================================

下面转载自:http://hi.baidu.com/excalibur/item/6abb9e318d107db9623aff36

 

X % 2^n = X & (2^n - 1)

注:2^n表示2的n次方

解析:假设n为3,则2^3 = 8,表示成2进制就是1000

2^3 - 1 = 0111; 此时X & (2^3 - 1) 就相当于取X的2进制的最后三位数。

从2进制角度来看,X / 8相当于 X >> 3,即把X右移3位,此时得到了X / 8的商,而被移掉的部分(后三位),则是X % 8,也就是余数。

// Round up the number of bytes to write
// to a sector boundary.
dwNumBytesXfer = (dwNumBytesXfer + cs.dwPageSize - 1) & ~(cs.dwPageSize - 1);

上面的代码是要把dwNumBytesXfer取成比它本身大的,cs.dwPageSize的整数倍的一个数。

即:如果cs.dwPageSize是8,dwNumBytesXfer是31,那么dwNumBytesXfer 最终得到的是 4*8 = 32

页大小肯定是2的n次方。某数 & (cs.dwPageSize - 1) 就相当于整除cs.dwPageSize

原创粉丝点击