亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java位運算知識點詳解

2024-07-14 08:42:14
字體:
來源:轉載
供稿:網友

在日常的Java開發中,位運算使用的不多,使用的更多的是算數運算(+、-、*、/、%)、關系運算(<、>、<=、>=、==、!=)和邏輯運算(&&、||、!),所以相對來說對位運算不是那么熟悉,本文將以Java的位運算來詳細介紹下位運算及其應用。

1、 位運算起源

位運算起源于C語言的低級操作,Java的設計初衷是嵌入到電視機頂盒內,所以這種低級操作方式被保留下來。所謂的低級操作,是因為位運算的操作對象是二進制位,但是這種低級操作對計算機而言是非常簡單直接,友好高效的。在簡單的低成本處理器上,通常位運算比除法快得多,比乘法快幾倍,有時比加法快得多。雖然由于較長的指令流水線和其他架構設計選擇,現代處理器通常執行加法和乘法的速度與位運算一樣快,但由于資源使用減少,位運算通常會使用較少的功率,所以在一些Java底層算法中,巧妙的使用位運算可以大量減少運行開銷。

2、 位運算詳解

Java位運算細化劃分可以分為按位運算和移位運算,見下表。

 

細化

符號

描述

運算規則

按位運算

&

兩位都為1,那么結果為1

|

有一位為1,那么結果為1

~

~0 = 1,~1 = 0

^

異或

兩位不相同,結果為1

移位運算

<< 

左移

各二進制位全部左移N位,高位丟棄,低位補0

>> 

右移

各二進制位全部右移N位,若值為正,則在高位插入 0,若值為負,則在高位插入 1

>>> 

無符號右移

各二進制位全部右移N位,無論正負,都在高位插入0

 

在進行位運算詳解之前,先來普及下計算機中數字的表示方法。對于計算機而言,萬物皆0、1,所有的數字最終都會轉換成0、1的表示,有3種體現形式,分別是:原碼、反碼和補碼。

原碼:原碼表示法在數字前面增加了一位符號位,即最高位為符號位,正數位該位為0,負數位該位為1.比如十進制的5如果用8個二進制位來表示就是00000101,-5就是10000101。

反碼:正數的反碼是其本身,負數的反碼在其原碼的基礎上,符號位不變,其余各個位取反。5的反碼就是00000101,而-5的則為11111010。

補碼:正數的補碼是其本身,負數的補碼在其原碼的基礎上,符號位不變,其余各位取反,最后+1。即在反碼的基礎上+1。5的反碼就是00000101,而-5的則為11111011。

了解了這幾個概念后,我們現在先記住一個結論,那就是在計算機系統中,數字一律用補碼來表示、運算和存儲,具體的原因可以看這篇文章的討論,這里不做更多討論,因為不是本文的重點。

2.1 與運算(&)

規則:轉為二進制后,兩位為1,則結果為1,否則結果為0。

舉例:

 

十進制

二進制(正數原碼、反碼、補碼一致)

10

00000000000000000000000000001010

&12

&00000000000000000000000000001100

=

=

8

00000000000000000000000000001000

 

 

十進制

二進制(原碼)

-6

10000000000000000000000000000110

&-2

&10000000000000000000000000000010

十進制

二進制(反碼)

-6

11111111111111111111111111111001

&-2

&11111111111111111111111111111101

十進制

二進制(補碼)

-6

11111111111111111111111111111010

&-2

&11111111111111111111111111111110

=

=

-6

11111111111111111111111111111010

 

最后的計算結果11111111111111111111111111111010還是補碼的形式,要看其十進制,還需要先轉成二進制原碼。

先轉反碼:11111111111111111111111111111010-1=11111111111111111111111111111001,得反碼11111111111111111111111111111001。

再轉原碼:在反碼的基礎上轉原碼,符號位不變,其他各位取反,得10000000000000000000000000000110。第一位1代表負數,后面0110轉成十進制是6,得-6。

2.2 或運算(|)

規則:轉為二進制后,有一位為1,則結果為1,否則結果為0。

舉例:

 

十進制

二進制(正數原碼、反碼、補碼一致)

10

00000000000000000000000000001010

|12

|00000000000000000000000000001100

=

=

14

00000000000000000000000000001110

 

 

十進制

二進制(原碼)

-6

10000000000000000000000000000110

|-2

|10000000000000000000000000000010

十進制

二進制(反碼)

-6

11111111111111111111111111111001

|-2

|11111111111111111111111111111101

十進制

二進制(補碼)

-6

11111111111111111111111111111010

|-2

|11111111111111111111111111111110

=

=

-2

11111111111111111111111111111110

 

2.3 非運算(~)

規則:轉為二進制后,~0 = 1,~1 = 0。

舉例:

 

十進制

二進制(正數原碼、反碼、補碼一致)

~7

~00000000000000000000000000000111

=

=

-8

11111111111111111111111111111000(補碼需轉換為原碼)

 

11111111111111111111111111111000-1得反碼,可以把1000看成是0112,得反碼

11111111111111111111111111110111。根據反碼得原碼10000000000000000000000000001000。

 

十進制

二進制(原碼)

~(-6)

~10000000000000000000000000000110

十進制

二進制(反碼)

~(-6)

~11111111111111111111111111111001

十進制

二進制(補碼)

~(-6)

~11111111111111111111111111111010

=

=

5

00000000000000000000000000000101(正數原碼、反碼、補碼一致)

 

2.4 異或運算(^)

規則:轉為二進制后,兩位不相同,結果為1,否則為0。

舉例:

 

十進制

二進制(正數原碼、反碼、補碼一致)

15^2

00000000000000000000000000001111

^00000000000000000000000000000010

=

=

13

00000000000000000000000000001101

 

2.5 左移運算(<<)

規則:轉為二進制后,各二進制位全部左移N位,高位丟棄,低位補0。

舉例:

 

十進制

二進制(正數原碼、反碼、補碼一致)

2<<2

00000000000000000000000000000010

=

0000000000000000000000000000001000

8

00000000000000000000000000001000

 

 

十進制

二進制(先取補碼 再對補碼操作位移)

-2<<2

10000000000000000000000000000010(原碼)

 

11111111111111111111111111111101(反碼)

 

11111111111111111111111111111110(補碼)

 

1111111111111111111111111111111000

 

11111111111111111111111111111000(補碼)

 

11111111111111111111111111110111(反碼)

-8

10000000000000000000000000001000(原碼)

 

2.6 右移運算(>>)

規則:轉為二進制后,各二進制位全部右移N位,若值為正,則在高位插入 0,若值為負,則在高位插入 1。

舉例:

 

十進制

二進制(正數原碼、反碼、補碼一致)

2>>2

00000000000000000000000000000010

=

0000000000000000000000000000000010

0

00000000000000000000000000000000

 

 

十進制

二進制(先取補碼 再對補碼操作位移)

-6>>2

10000000000000000000000000000110(原碼)

 

11111111111111111111111111111001(反碼)

 

11111111111111111111111111111010(補碼)

 

1111111111111111111111111111111010

 

11111111111111111111111111111110(補碼)

 

11111111111111111111111111111101(反碼)

-2

10000000000000000000000000000010(原碼)

 

2.7 無符號右移運算(>>>)

規則:轉為二進制后,各二進制位全部右移N位,無論正負,都在高位插入0。

舉例:

 

十進制

二進制(先取補碼 再對補碼操作位移)

-1>>>1

10000000000000000000000000000001(原碼)

 

11111111111111111111111111111110(反碼)

 

11111111111111111111111111111111(補碼)

 

011111111111111111111111111111111

 

01111111111111111111111111111111(補碼)

 

01111111111111111111111111111110(反碼)

溢出,只能表示到int的最大值2147483647

10000000000000000000000000000001(原碼)

 

3、 應用

3.1 不用額外的變量實現兩個數字互換

見參考資料中的BitOperationTest,方法reverse通過三次異或操作完成了兩個變量值的替換。

證明很簡單,我們只需要明白異或運算滿足下面規律(實際不止如下規律):

0^a = a,a^a = 0;

a ^ b = b ^ a;

a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;

a ^ b ^ a = b;

假設a,b兩個變量,經過如下步驟完成值交換:a=a^b,b=b^a,a=a^b。

證明如下:

因為a ^ b = b ^ a,又a=a^b,b=b^a。故b=b^a= b^ (a^b)=a。

繼續a=a^b,a=(a^b) ^ b^ (a^b),故a=b。完成值交換。

3.2 不用判斷語句實現求絕對值

公式如下:(a^(a>>31))-(a>>31)

先整理一下使用位運算取絕對值的思路:若a為正數,則不變,需要用異或0保持的特點;若a為負數,則其補碼為原碼翻轉每一位后+1,先求其原碼,補碼-1后再翻轉每一位,此時需要使用異或1具有翻轉的特點。

任何正數右移31后只剩符號位0,最終結果為0,任何負數右移31后也只剩符號位1,溢出的31位截斷,空出的31位補符號位1,最終結果為-1.右移31操作可以取得任何整數的符號位。

那么綜合上面的步驟,可得到公式。a>>31取得a的符號,若a為正數,a>>31等于0,a^0=a,不變;若a為負數,a>>31等于-1 ,a^-1翻轉每一位。

3.3 判斷一個數的奇偶性

通過與運算判斷奇偶數,偽代碼如下:

n&1 == 1?”奇數”:”偶數”

奇數最低位肯定是1,而1的二進制最低位也是1,其他位都是0,所以所有奇數和1與運算結果肯定是1。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品免费在线播放| 欧美成人手机在线| 亚洲人在线观看| 国产一区二区在线免费视频| 国产成人一区二区| 91国偷自产一区二区三区的观看方式| 欧美激情一区二区三区久久久| 日韩一区二区久久久| 成人av.网址在线网站| 久久这里有精品视频| 久久久久久久久久久人体| 日韩av最新在线观看| 国产suv精品一区二区三区88区| 黑人巨大精品欧美一区免费视频| 国产精品青青在线观看爽香蕉| 久久不射热爱视频精品| 欧美另类暴力丝袜| 日韩精品高清视频| 精品爽片免费看久久| 亚洲精品久久久久久久久久久久久| 国产精品伦子伦免费视频| 丝袜美腿亚洲一区二区| 成人亚洲综合色就1024| 视频在线一区二区| 欧美午夜xxx| 欧美韩日一区二区| 91香蕉国产在线观看| 色婷婷综合久久久久| 久久影院免费观看| 中文亚洲视频在线| 色樱桃影院亚洲精品影院| 日韩中文字幕第一页| 亚洲欧美变态国产另类| 欧美精品一区在线播放| 91免费电影网站| 亚洲人免费视频| 精品久久中文字幕久久av| 亚洲欧洲免费视频| 日韩中文字幕第一页| 久久久999国产精品| 精品露脸国产偷人在视频| 久久视频在线看| 亚洲黄色片网站| 亚洲第一男人av| 亚洲乱码国产乱码精品精| 992tv成人免费视频| 久久视频免费在线播放| 国产精品白嫩初高中害羞小美女| 26uuu另类亚洲欧美日本一| 国产精品久久久久高潮| 亚洲天堂精品在线| 45www国产精品网站| 国产一区二区三区在线观看网站| 欧美激情亚洲综合一区| 欧美日韩高清区| 日韩欧美高清在线视频| 亚洲一区二区精品| 91亚洲精品在线| 国产精品wwwwww| 欧美电影《睫毛膏》| 欧美最近摘花xxxx摘花| 久久久久久这里只有精品| 日韩欧美在线看| 日韩中文字幕免费| 亚洲国产精品va| 久久人人爽人人爽人人片亚洲| 成人动漫网站在线观看| 成人中文字幕+乱码+中文字幕| 国产精品黄色影片导航在线观看| 日韩精品在线视频观看| 久久69精品久久久久久久电影好| 欧美老妇交乱视频| 国产精品一香蕉国产线看观看| 黑人极品videos精品欧美裸| 国产在线视频2019最新视频| 97视频网站入口| 欧美在线免费观看| 亚洲人成电影网站| 97精品视频在线播放| 精品欧美激情精品一区| 国产91久久婷婷一区二区| 欧美成人精品在线| 欧美日韩国产一区中文午夜| 久久久久亚洲精品国产| 中文字幕少妇一区二区三区| 精品国产自在精品国产浪潮| 欧美性猛交xxxxx免费看| 亚洲国产欧美一区二区三区同亚洲| 国产伦精品一区二区三区精品视频| 亚洲国产日韩欧美在线图片| 国产日本欧美一区二区三区| 91精品久久久久久| 一本色道久久88综合日韩精品| 一区二区亚洲欧洲国产日韩| 日本aⅴ大伊香蕉精品视频| 亚洲国产成人精品久久久国产成人一区| 久久综合免费视频影院| 国产精品免费一区豆花| 国产精品亚洲激情| 亚洲美女在线观看| 57pao精品| 亚洲xxxx做受欧美| 欧美黄色成人网| 日韩暖暖在线视频| 狠狠躁夜夜躁人人躁婷婷91| 日本中文字幕不卡免费| 亚洲国产精品悠悠久久琪琪| 亚洲天堂男人的天堂| 久久久精品国产亚洲| 91视频-88av| 国产亚洲精品综合一区91| 亚洲国内高清视频| 岛国av一区二区在线在线观看| 96国产粉嫩美女| 伊人伊人伊人久久| 欧美精品国产精品日韩精品| 国产精品视频永久免费播放| 国产一区二区三区在线观看视频| 中文字幕欧美在线| 中文字幕精品在线| 久久精品一偷一偷国产| 欧美精品18videos性欧| 中文字幕欧美在线| 亚洲精品视频久久| 国模吧一区二区三区| 色综合色综合久久综合频道88| 国产精品91久久久久久| 国产精品夜间视频香蕉| 亚洲午夜精品久久久久久性色| 欧美精品一区三区| 日韩精品小视频| 色诱女教师一区二区三区| 欧美三级欧美成人高清www| 国产一区二区美女视频| 国产精品成人免费电影| 久久久欧美一区二区| 亚洲激情免费观看| 国产精品久久久久久久久久| 国产精品入口夜色视频大尺度| 亚洲精品美女在线观看播放| 97视频色精品| 欧美精品videofree1080p| 日韩电影中文字幕在线| 欧美主播福利视频| 久久精品国产久精国产一老狼| 91高清免费在线观看| 欧美又大粗又爽又黄大片视频| 亚洲欧洲激情在线| 亚洲成avwww人| 98视频在线噜噜噜国产| 国产免费一区视频观看免费| 91禁国产网站| 亚洲激情视频网| 国产精品免费久久久| 狠狠综合久久av一区二区小说| 国产丝袜一区视频在线观看| 精品美女国产在线| 久久色在线播放| 亚洲电影在线观看| 亚洲国产精品电影| 日本亚洲精品在线观看| 亚洲影院色无极综合| 国产噜噜噜噜久久久久久久久| 成人性教育视频在线观看|