java取余位运算_使用位运算取余
取余運算符為“%”。但在以前,CPU采用如下方法計算余數(注意,該方法只對2的N次方數系有效):
X & (2^N - 1)
舉個例子:
9 % 4 //因為4是2^2;所以可以使用位運算X & (2^N - 1)代替取余
= 9 & ( 4 - 1 )
= 9 & 3
= 1001 & 0011
= 0001
= 1
原理:
二進制數乘以2^n,相當于左移n位;
二進制數除以2^n,相當于右移n位;
任何二進制數和1的&操作,還是原來的二進制數
舉個例子:
9 轉換為二進制為 1001
1001 = 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0
那么:
1001 * 2^1
= (1*2^3 + 0*2^2 + 0*2^1 + 1*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左移一位變成10010
1001 / 2^1
= (1*2^3 + 0*2^2 + 0*2^1 + 1*2^0)/ 2^1
= 1*2^2 + 0*2^1 + 0*2^0
= 100
可知 1001 / 2,相當于將1001右移一位變成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^(m-m) + x*2^(m-1-m) + ... + x*2^(0-m)
x*2^(m-m) = x*2^0 ,這就是所得二進制數的最低位,而其后面的那些項x*2^(m-1-m) + ... + x*2^(0-m)
就是余數
這里相當于把 xx...xx 右移了 m 位,而移出去的那 m 位,就是余數(因為前面的都可以整除,后面的是不可以整除的,就是余數)
我們知道:
二進制的 2^m -1,總共有m+1位, 除了最高位 m+1 位為0,其余 m 位都為1
任何二進制數和1的&操作,原數都不變
那么:
xx...xx & (2^m -1) 相當于取出了xx...xx 的低 m 位二進制數,也就是上面所說的右移出去的那m位數,也就是余數
總結
以上是生活随笔為你收集整理的java取余位运算_使用位运算取余的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高中计算机八字标语,高中励志八字标语40
- 下一篇: 税务计算机类考试题型,税务师考试题型分值