你不知道的位操作之整数取余

本文介绍了一种使用位操作实现整数取余的方法,特别是如何通过位与操作求得一个整数除以2^n的余数。通过具体实例展示了这一技巧的应用,并解释了其背后的原理。

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

你不知道的位操作之整数取余 
对任一整数x,n

x%2n=x&(2n-1)

对于整数的2的倍数的乘除法我们可以通过位的右移算术左移来实现,那么对于整数除以2n的余数怎么用位操作来实现?
在看编程珠玑一书中实现的位向量时,发现了x&0x1f怎么都想不通这是干什么的?最后编写代码试了下,竟是对任意一个整数除32取余,最后用二进制研究了下,当然我们不必真的去写32个0和1的二进制出来, 
可以简化下用8个二进制来测试,
0x1f的二进制00011111,
32的二进制00100000,
64的二进制01000000,
96的二进制01100000,
都是32的整数倍,如果不是32的整数倍会是什么样?
35  00100001,
99  01100011,
经过观察会发现,在倒数第六位以后的每位的位权都是小于32的而且加起来的值也是小于32的,所以在倒数第六位以后出现的都是除以32的余数,由此我们还可以发现,任意一个整数的余数不可能大于它本身,且至少比本身小1,所以用一个字节表示的最大的数值是2的8次方减一。
如对任意整数除2取余,2的二进制 0010
15%2 :
1111&0001=1
9%2 :
1001&0001=1
4%2 :
0100&0001=0 
对任一整数x

x%2n=x&(2n-1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值