取余与位运算

本文探讨了位运算和取余操作在编程中的应用,并详细解释了如何利用位运算实现取余的效果,同时展示了实际代码案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

下面转载自: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值