背景:在C风格语言中(比如C,C++,C# (注:排名按出生日期 ^_^)),取余运算符定义为“%”。但在很久很久以前,CPU采用如下方法计算余数(注意,该方法只对2的N次方数系有效):
X & (2^N - 1)
看到这个算法,我感到比较好奇,为什么这么做呢?
首先从求余数谈起,我们知道,计算机中存储的方式是0和1序列:
1 0001 2^0
2 0010 2^1
3 0011 2^1 + 1
4 0100 2^2
当我们把这些数字序列左移一位的时候... 是的,你答对了,相当与数字扩大为原来的2倍,同理可知右移一位就是缩小为原来的1/2。
那么余数在哪里?被移掉的哪些位便是余数,这是无数前人的证明结果~可以自己拿笔和纸画一画就明白了。
那么,说了这么多,为什么一个求余的%被替换为:X & (2^N - 1)?
举例:
9 的二进制就是1001
8 的二进制就是1000
显然余数是1,按照公式这么做:
把8的二进制1000换为8-1也就是7,7的二进制表示为:0111
1001&0111 = 0001
答案为1与我们想的结果一致。
是巧合么?我们把9换成13,过程你亲自来一遍,结果在你没算错的情况下必然和我的一样:0101
但是注意&#x