你不知道的位操作之整数取余
对任一整数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
如对任意整数除2取余,2的二进制 0010
15%2 :
1111&0001=1
9%2 :
1001&0001=1
4%2 :
0100&0001=0
对任一整数x
x%2n=x&(2n-1)