Java位運(yùn)算

全篇的精華在于:** x<<y 相當(dāng)于 x*2y;x>>y相當(dāng)于x/2y **。
哈哈,如果想繼續(xù)了解就往下閱讀吧希望可以幫到你

本文轉(zhuǎn)載于CSDN博客,想關(guān)注原文的請(qǐng)點(diǎn)這里,謝謝原作者!

1.表示方法:
在Java語(yǔ)言中,二進(jìn)制數(shù)使用補(bǔ)碼表示,最高位為符號(hào)位,正數(shù)的符號(hào)位為0,負(fù)數(shù)為1。補(bǔ)碼的表示需要滿足如下要求。  
(1)正數(shù)的最高位為0,其余各位代表數(shù)值本身(二進(jìn)制數(shù))。  
(2)對(duì)于負(fù)數(shù),通過對(duì)該數(shù)絕對(duì)值的補(bǔ)碼按位取反,再對(duì)整個(gè)數(shù)加1。
2.位運(yùn)算符  
位運(yùn)算表達(dá)式由操作數(shù)和位運(yùn)算符組成,實(shí)現(xiàn)對(duì)整數(shù)類型的二進(jìn)制數(shù)進(jìn)行位運(yùn)算。位運(yùn)算符可以分為邏輯運(yùn)算符(包括~、&、|和^)及移位運(yùn)算符(包括>>、<<和>>>)。
1)左移位運(yùn)算符(<<)能將運(yùn)算符左邊的運(yùn)算對(duì)象向左移動(dòng)運(yùn)算符右側(cè)指定的位數(shù)(在低位補(bǔ)0)。
2)“有符號(hào)”右移位運(yùn)算符(>>)則將運(yùn)算符左邊的運(yùn)算對(duì)象向右移動(dòng)運(yùn)算符右側(cè)指定的位數(shù)。 “有符號(hào)”右移位運(yùn)算符使用了“符號(hào)擴(kuò)展”:若值為正,則在高位插入0;若值為負(fù),則在高位插入1。
3)Java也添加了一種“無(wú)符號(hào)”右移位運(yùn)算符(>>>),它使用了“零擴(kuò)展”:無(wú)論正負(fù),都在高位插入0。這一運(yùn)算符是C或C++沒有的。
4)若對(duì)char,byte或者short進(jìn)行移位處理,那么在移位進(jìn)行之前,它們會(huì)自動(dòng)轉(zhuǎn)換成一個(gè)int。 只有右側(cè)的5個(gè)低位才會(huì)用到。這樣可防止我們?cè)谝粋€(gè)int數(shù)里移動(dòng)不切實(shí)際的位數(shù)。 若對(duì)一個(gè)long值進(jìn)行處理,最后得到的結(jié)果也是long。此時(shí)只會(huì)用到右側(cè)的6個(gè)低位,防止移動(dòng)超過long值里現(xiàn)成的位數(shù)。 但在進(jìn)行“無(wú)符號(hào)”右移位時(shí),也可能遇到一個(gè)問題。若對(duì)byte或short值進(jìn)行右移位運(yùn)算,得到的可能不是正確的結(jié)果(Java 1.0和Java 1.1特別突出)。 它們會(huì)自動(dòng)轉(zhuǎn)換成int類型,并進(jìn)行右移位。但“零擴(kuò)展”不會(huì)發(fā)生,所以在那些情況下會(huì)得到-1的結(jié)果。
在進(jìn)行位運(yùn)算時(shí),需要注意以下幾點(diǎn)。

(1)>>>和>>的區(qū)別是:在執(zhí)行運(yùn)算時(shí),>>>運(yùn)算符的操作數(shù)高位補(bǔ)0,而>>運(yùn)算符的操作數(shù)高位移入原來(lái)高位的值。

(2)右移一位相當(dāng)于除以2,左移一位(在不溢出的情況下)相當(dāng)于乘以2;移位運(yùn)算速度高于乘除運(yùn)算。

(3)若進(jìn)行位邏輯運(yùn)算的兩個(gè)操作數(shù)的數(shù)據(jù)長(zhǎng)度不相同,則返回值應(yīng)該是數(shù)據(jù)長(zhǎng)度較長(zhǎng)的數(shù)據(jù)類型。

(4)按位異或可以不使用臨時(shí)變量完成兩個(gè)值的交換,也可以使某個(gè)整型數(shù)的特定位的值翻轉(zhuǎn)。

(5)按位與運(yùn)算可以用來(lái)屏蔽特定的位,也可以用來(lái)取某個(gè)數(shù)型數(shù)中某些特定的位。

(6)按位或運(yùn)算可以用來(lái)對(duì)某個(gè)整型數(shù)的特定位的值置l。

3.位運(yùn)算符的優(yōu)先級(jí)
~的優(yōu)先級(jí)最高,其次是<<、>>和>>>,再次是&,然后是^,優(yōu)先級(jí)最低的是|。

**二, 按位異或運(yùn)算符^ **
參與運(yùn)算的兩個(gè)值,如果兩個(gè)相應(yīng)位相同,則結(jié)果為0,否則為1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0
例如:10100001^00010001=10110000
   00=0,01=1 0異或任何數(shù)=任何數(shù)
   10=1,11=0 1異或任何數(shù)-任何數(shù)取反
   任何數(shù)異或自己=把自己置0
(1)按位異或可以用來(lái)使某些特定的位翻轉(zhuǎn),如對(duì)數(shù)10100001的第2位和第3位翻轉(zhuǎn),可以將數(shù)與00000110進(jìn)行按位異或運(yùn)算。                     10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6
(2)通過按位異或運(yùn)算,可以實(shí)現(xiàn)兩個(gè)值的交換,而不必使用臨時(shí)變量。
例如交換兩個(gè)整數(shù)a,b的值,可通過下列語(yǔ)句實(shí)現(xiàn):
a=10100001,b=00000110
a=a^b;   //a=10100111
b=b^a;   //b=10100001
a=a^b;   //a=00000110
(3)異或運(yùn)算符的特點(diǎn)是:數(shù)a兩次異或同一個(gè)數(shù)b(a=abb)仍然為原值a.

** 三,Java 中除了二進(jìn)制的表示方法: **
由于數(shù)據(jù)在計(jì)算機(jī)中的表示,最終以二進(jìn)制的形式存在,所以有時(shí)候使用二進(jìn)制,可以更直觀地解決問題。
但,二進(jìn)制數(shù)太長(zhǎng)了。比如int 類型占用4個(gè)字節(jié),32位。比如100,用int類型的二進(jìn)制數(shù)表達(dá)將是:
0000 0000 0000 0000 0110 0100
面對(duì)這么長(zhǎng)的數(shù)進(jìn)行思考或操作,沒有人會(huì)喜歡。因此,C,C++,以及java中 沒有提供在代碼直接寫二進(jìn)制數(shù)的方法。
** 八進(jìn)制數(shù)的表達(dá)方法 **
如何表達(dá)一個(gè)八進(jìn)制數(shù)呢?如果這個(gè)數(shù)是 876,我們可以斷定它不是八進(jìn)制數(shù),因?yàn)榘诉M(jìn)制數(shù)中不可能出7以上的阿拉伯?dāng)?shù)字。但如果這個(gè)數(shù)是123、是567,或12345670,那么它是八進(jìn)制數(shù)還是10進(jìn)制數(shù),都有可能。
所以規(guī)定,一個(gè)數(shù)如果要指明它采用八進(jìn)制,必須在它前面加上一個(gè)0,如:123是十進(jìn)制,但0123則表示采用八進(jìn)制。這就是八進(jìn)制數(shù)的表達(dá)方法。 現(xiàn)在,對(duì)于同樣一個(gè)數(shù),比如是100,我們?cè)诖a中可以用平常的10進(jìn)制表達(dá),例如在變量初始化時(shí):
int a = 100;
我們也可以這樣寫:
int a = 0144; //0144是八進(jìn)制的100;一個(gè)10進(jìn)制數(shù)如何轉(zhuǎn)成8進(jìn)制。
千萬(wàn)記住,用八進(jìn)制表達(dá)時(shí),你不能少了最前的那個(gè)0。否則計(jì)算機(jī)會(huì)通通當(dāng)成10進(jìn)制。不過,有一個(gè)地方使用八進(jìn)制數(shù)時(shí),卻不能使用加0,那就是我們前面學(xué)的用于表達(dá)字符的“轉(zhuǎn)義符”表達(dá)法。
** 十六進(jìn)制數(shù)的表達(dá)方法 **
如果不使用特殊的書寫形式,16進(jìn)制數(shù)也會(huì)和10進(jìn)制相混。隨便一個(gè)數(shù):9876,就看不出它是16進(jìn)制或10進(jìn)制。
16進(jìn)制數(shù)必須以 0x開頭。比如 0x1表示一個(gè)16進(jìn)制數(shù)。而1則表示一個(gè)十進(jìn)制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不區(qū)分大小寫。(注意:0x中的0是數(shù)字0,而不是字母O)
以下是一些用法示例:
int a = 0x100F;
int b = 0x70 + a;
最后一點(diǎn)很重要,10進(jìn)制數(shù)有正負(fù)之分,比如12表示正12,而-12表示負(fù) 12,;但8進(jìn)制和16進(jìn)制只能用來(lái)表達(dá)無(wú)符號(hào)的正整數(shù),如果你在代碼中里:-078,或者寫:-0xF2,編譯器并不把它當(dāng)成一個(gè)負(fù)數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 數(shù)據(jù)在計(jì)算機(jī)中都是以補(bǔ)碼形式存放的,位運(yùn)算也是以一個(gè)數(shù)的補(bǔ)碼進(jìn)行運(yùn)算,結(jié)果也自然也是一個(gè)補(bǔ)碼,這點(diǎn)在分析計(jì)算過程時(shí)...
    SharpChen閱讀 728評(píng)論 0 4
  • 本章將會(huì)介紹 模塊和源文件訪問級(jí)別訪問控制語(yǔ)法自定義類型子類常量、變量、屬性、下標(biāo)構(gòu)造器協(xié)議擴(kuò)展泛型類型別名位運(yùn)算...
    寒橋閱讀 904評(píng)論 0 2
  • 高級(jí)運(yùn)算符(Advanced Operators) 本文參考自蘋果官方文檔Advanced Operators本頁(yè)...
    果啤閱讀 1,615評(píng)論 1 5
  • 一項(xiàng)指令是否具有權(quán)力,決定者是指令的接受者,并非是指令的發(fā)出者。讓員工欣然接受你的命令,通過自己的努力來(lái)完成任務(wù),...
    濰坊泰華DDM店劉云閱讀 263評(píng)論 0 0
  • 【點(diǎn)石成金】20170606 學(xué)習(xí)力6 Day22 今天的踐行依舊是每天必做的精讀與泛讀。二十天下來(lái),我收...
    葉子ya豆子閱讀 236評(píng)論 0 0