java的位運算解析(&/|/~/^/>>/>)
簡介
說到位運算,自然說的全部都是二進位制運算,相信大家都比較熟悉,但我還是要說明(囉嗦)一下,java裡int型是4個位元組,即32位,用二進位制表示java裡的1就是000……0001,這些都是有符號的數,也就是最高位代表符號位,也就是32位能表示的最大整數是2的32次方-1.下面舉得栗子,我不會自己為難自己,搞十幾位數,所有都是二位數,所有隻用一個位元組,且最高依然代表符號位。
& 與運算子
與運算子就相當於&&,不同的是,這是按位對比,比如8&9,用十進位制的眼光去看簡直就瞎了,8&9其實做的運算就是00001000&00001001,然後看到當且僅當兩個對應的位置都是1,結果才是1,否則結果為0
那麼,這個運算有什麼卵用麼?答案是當然有啦,比如,我們現在都是用int去做標誌位,比如1代表正常,0代表異常,那如果我們用二進位制來做的話,不就很爽了麼,0001代表正常0010代表異常,0100代表XXX,是不是想想都有點小激動·····
| 或運算子
或運算子就相當於||, 當然也是按位去或的,當且僅當兩個對應的位置都是0,結果才是0,否則結果是1,那麼8|9就是00001000|00001001,結果就是00001001=9。至於這個有什麼用,我就不贅述了,有規則就會有用,就這麼簡單·····
~運算子
非運算子是又得講一下的,理解起來很容易的,就是按位取反,比如~8對吧,那就是00001000按位取反結果是11110111.前面說了,這是有符號數,也就是最高位代表符號位,也就是~8的結果是一個負數,那麼人類第一反應是-8,但結果卻不是,那這裡簡單解析一下,負數的二進位制表示方式跟正數不一樣,負數有一個反碼和補碼的概念,這麼理解呢?就說-8吧,用二進位制表示-8是:11111000,-10的二進位制是:11110110.
首先-8的絕對值8的二進位制是00001000, 求其反碼就是11110111,補碼(+1)是11111000。那麼上面~8的結果11110111是多少呢?我們算一下,先-1得到11110110,然後取反:00001001,得到9,那麼~8==9?不是的,是結果的絕對值,因為是負數,所以是-9.這個結果大家可以去驗證下~~~
^異或運算子
異或運算是:當運算子兩邊不同的時候結果為1,兩邊相同的時候結果為0 這就是傳說中的同性相殺,異性相吻。舉個例子就是:8^6=1000^0110=1110=14
>>位移運算子(<<同理)
位移運算子我們可以簡單的理解為乘除法,像左移是除法,向右移是乘法。這個符號位是不移動的,注意下。8>>2大家不要理解為8/2,位移兩位就是除以2的2次方也就是8/4.這裡注意9>>1的結果是4,即最低位的1會移沒了··當然了<<如果結果超過了最大整數能表示的範文,那就·····你懂的。
>>> 這個應該是無符號的位移運算子
這個運算子跟>>差不多,不同點是,它移動後高位補0,。好像>>位移後高位也是補0啊,是的,但符號位不移動,而>>>tm符號位都移動了,就是負數一移就正了·····