将馀数运算符设为“%”。 但是,以前CPU通过以下方法计算盈馀: (请注意,该方法仅对2的n次幂系统有效。 )
x(2^n-1 ) ) ) )。
举个例子:
因为9 % 4 //是2^2; 因此,可以使用位运算x(2^n-1 )来代替取馀数
=9(4-1) )。
=9 3
=1001 0011
=0001
=1
原理:
二进制乘以2^n,相当于向左移位n位;
二进制除以2^n,相当于向右移位n位;
二进制数和一的操作仍然是原始二进制数
举个例子:
将9转换为二进制值为1001
1001=1*2^3 0*2^2 0*2^1 1*2^0
那么,如下。
1001 * 2^1
=(1*2^30*2^20*2^11*2^0)2^1
=2*2^3 0*2^2 0*2^1 2*2^0
=2^4 0*2^3 0*2^2 1*2^1 0*2^0
=10010
可知1001*2相当于将1001向左偏移1位设为10010
1001/2^1
=(1*2^30*2^20*2^11*2^0)/2^1
=1*2^2 0*2^1 0*2^0
=100
可知1001/2相当于将1001向右偏移1位设为100,而且向右偏移1是1001/2的馀数
要将任意数转换为二进制数,请尝试将该二进制数的各位(1或0 )分别乘以2^n。 (这里的n从右开始依次是0、1、2……)
我们用x表示普通n位的二进制各位。 (这个x不需要烦恼。 那个1和0都可以。 只是,这样表示也不会对结果有什么影响。 )
xx.xx=x*2^(n-1 ) x *2^ (n-2 ) . x*2^1 x*2^0
这个数是2^m次方
xx.xx/2^m
=(x*2^(n-1 ) x *2^ (n-2 ) ) . x*2^1 x*2^0)/2^m
=x*2^(n-1-m )=x*2^(n-1-m )…x*2^(0-m ) …x*2^(0-m )…x*2^(0-m ) () ) ) )
=x*2^0(m-m )=x*2^0,这是得到的二进制数的最低位,其后的项x*2^ ) m-1-m )=x*2^0)0-m )。
过剩
这里相当于将xx.xx向右偏移m位,出去的m位是剩余的。 (因为前面的东西能整除,后面的东西不能整除是多余的。) )。
我们知道:
二进制2^m -1共有m 1位,除最高m 1位为0外,其馀m位均为1
二进制和一的操作不会改变原始数量
那么,如下。
xx.xx(2^m-1 )相当于从中检索xx.xx的低m位的二进制数,即上述向右移动的m位,即馀数