全篇的精華在于:** x<<y 相當(dāng)于 x*2y眶蕉;x>>y相當(dāng)于x/2y **。
哈哈唧躲,如果想繼續(xù)了解就往下閱讀吧希望可以幫到你
本文轉(zhuǎn)載于CSDN博客造挽,想關(guān)注原文的請(qǐng)點(diǎn)這里,謝謝原作者弄痹!
1.表示方法:
在Java語言中饭入,二進(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也添加了一種“無符號(hào)”右移位運(yùn)算符(>>>),它使用了“零擴(kuò)展”:無論正負(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)行“無符號(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ù)高位移入原來高位的值制妄。
(2)右移一位相當(dāng)于除以2,左移一位(在不溢出的情況下)相當(dāng)于乘以2泵三;移位運(yùn)算速度高于乘除運(yùn)算耕捞。
(3)若進(jìn)行位邏輯運(yùn)算的兩個(gè)操作數(shù)的數(shù)據(jù)長度不相同衔掸,則返回值應(yīng)該是數(shù)據(jù)長度較長的數(shù)據(jù)類型。
(4)按位異或可以不使用臨時(shí)變量完成兩個(gè)值的交換俺抽,也可以使某個(gè)整型數(shù)的特定位的值翻轉(zhuǎn)敞映。
(5)按位與運(yùn)算可以用來屏蔽特定的位,也可以用來取某個(gè)數(shù)型數(shù)中某些特定的位磷斧。
(6)按位或運(yùn)算可以用來對(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)按位異或可以用來使某些特定的位翻轉(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的值阴挣,可通過下列語句實(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ù)太長了宿百。比如int 類型占用4個(gè)字節(jié)趁仙,32位。比如100垦页,用int類型的二進(jìn)制數(shù)表達(dá)將是:
0000 0000 0000 0000 0110 0100
面對(duì)這么長的數(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)制秒梅。
千萬記住旗芬,用八進(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)制只能用來表達(dá)無符號(hào)的正整數(shù),如果你在代碼中里:-078卷胯,或者寫:-0xF2,編譯器并不把它當(dāng)成一個(gè)負(fù)數(shù)子刮。