日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java取余位运算_使用位运算取余

發(fā)布時間:2023/12/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java取余位运算_使用位运算取余 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

取余運算符為“%”。但在以前,CPU采用如下方法計算余數(shù)(注意,該方法只對2的N次方數(shù)系有效):

X & (2^N - 1)

舉個例子:

9 % 4 //因為4是2^2;所以可以使用位運算X & (2^N - 1)代替取余

= 9 & ( 4 - 1 )

= 9 & 3

= 1001 & 0011

= 0001

= 1

原理:

二進制數(shù)乘以2^n,相當于左移n位;

二進制數(shù)除以2^n,相當于右移n位;

任何二進制數(shù)和1的&操作,還是原來的二進制數(shù)

舉個例子:

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的余數(shù)

任意一個數(shù)轉換成二進制,我們可以分別將它二進制的每一位(1或者0)去乘以 2^n (這里的n從右邊開始數(shù)依次為 0、1、2 ......)

我們用x表示一個普通的 n 位二進制數(shù)的每一位(這個 x 不需要去糾結,它可以是1也可以是0,只是這么表示,對結果沒有什么影響),如下:

xx...xx = x*2^(n-1) + x*2^(n-2) +...+ x*2^1 + x*2^0

這個數(shù)處以一個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 ,這就是所得二進制數(shù)的最低位,而其后面的那些項x*2^(m-1-m) + ... + x*2^(0-m)

就是余數(shù)

這里相當于把 xx...xx 右移了 m 位,而移出去的那 m 位,就是余數(shù)(因為前面的都可以整除,后面的是不可以整除的,就是余數(shù))

我們知道:

二進制的 2^m -1,總共有m+1位, 除了最高位 m+1 位為0,其余 m 位都為1

任何二進制數(shù)和1的&操作,原數(shù)都不變

那么:

xx...xx & (2^m -1) 相當于取出了xx...xx 的低 m 位二進制數(shù),也就是上面所說的右移出去的那m位數(shù),也就是余數(shù)

總結

以上是生活随笔為你收集整理的java取余位运算_使用位运算取余的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。