二進制運算的(自己重新新整理的)

1. 按位與(&)
  位運算實質是將參與運算的數字轉換爲二進制,而後逐位對應進行運算。
  按位與運算爲:兩位全爲1,結果爲1,即1&1=1,1&0=0,0&1=0,0&0=0。
  例如51 & 5 -> 00110011 & 00000101 = 00000001 -> 51 & 5 = 1
  特殊用法:
  (1)與0相與可清零。
( 2 )與1相與可保留原值,可從一個數中取某些位。
例如需要取10101110中的低四位10101110 & 00001111 =00001110 ,即得到所需結果。
(3)n & 1==0 –>n爲偶數,
n & 1==1 –>n爲奇數;
如果n爲偶數,其二進制最右邊的值必定爲0,和1做‘與’運算,結果必定是0
(4) n&(n-1)==0 –>檢查n是否爲2 的整數次冪,或者檢查n是否爲0
2. 按位或(|)
  兩位只要有一位爲1,結果則爲1,即1|1=1,1|0=1,0|1=1,0|0=0。
  特殊用法:
  (1)與0相或可保留原值。
  (2)與1相或可將對應位置1。例如,將X=10100000的低四位置1,使X | 00001111 = 10101111即可。
3. 異或運算(^)
  兩位爲“異”,即一位爲1一位爲0,則結果爲1,否則爲0。即1^1=0,1^0=1,0^1=1,0^0=0。
  特殊用法:
  (1)使指定位翻轉:找一個數,對應X要翻轉的各位爲1,其餘爲0,使其與X進行異或運算即可。例如,X=10101110,使低四位翻轉(低四位取反),X ^ 00001111 = 10100001。
  (2)與0相異或保留原值。例如X ^ 00000000 = 10101110。
  (3)交換兩變量的值。(比藉助容器法、加減法效率高)原理:一個數對同一個數連續兩次進行異或運算,結果與這個數相等。
  因此,交換方法爲:A = A ^ B,B = A ^ B,A = A ^ B。
  (4)判斷兩個數不同的位數。
4. 取反(~)
  將一個數按位取反,即~ 0 = 1,~ 1 = 0。
只要記住求 “~” 的時候,先給原數字加1,然後取反方向就行了。
比如~5,5+1=6,取反方向,就是-6。
再比如 ~(-4),-4+1=-3,反方向,就是3。
5. 左移(<<)
  將一個數左移x位,即左邊丟棄x位,右邊用0補x位。例:11100111 << 2 = 10011100。
拓展:
==原碼==:一個整數按照絕對值大小轉換爲二進制即爲原碼;
==反碼==:將二進制數按位取反,得到的即爲反碼;
==補碼==:反碼加1即爲補碼。
==由於計算機底層硬件的限制,負數均使用補碼錶示。==
  若左移時捨棄的高位全爲0,則每左移1位,相當於該數十進制時乘一次2。
  例:11(1011) << 2 = 44(11表示爲1011時實際上不完整,若計算機中規定整型的大小爲32bit,則11的完整二進制形式爲00000000 00000000 0000000 00001011)
求int 最大值 : (1 << 31) – 1 或者乾脆 0x7FFFFFFF
6. 右移(>>)
  將一個數右移若干位,右邊捨棄,正數左邊補0,負數左邊補1。每右移一位,相當於除以一次2。
(1)  例:4 >> 2 = 1,-14 >> 2 = -4。
-14:(用八位二進制表示)
源碼 1000 1110
反碼 1111 0001
補碼 1111 0010
1111 0010>>2 =1111 1100(負數向右移位,’10’移除被捨棄,剩餘原來的最右邊兩位’00’,空缺的兩個高位用1填補)
補碼第一位表示的是正負(1:負,0:正)1111 1100(二進制),將此補碼減去1,然後取反得到-14右移兩位後的源碼(左側第一位爲符號位,不參與取反操作):1000 0100(二進制)==-4(十進制)
注意:計算機內是以補碼進行運算的,需要轉換爲源碼是需要的數據,不能用源碼進行進制轉換
(2)
var a=-4>>2;
Window.alert(a); //結果是-1
原理:
-4 原碼:10000000 00000100 -> 反碼:11111111 11111011 -> 補碼 (+1):11111111 11111100
向右移動2位 11 11111111 111111 -> (減1) 反碼 11111111 11111110-> (符號位不變,其他全部取反)原碼 10000000 00000001 —運行結果是-1

7. 無符號右移(>>>)
  將一個數右移若干位(忽略符號),左邊補0,右邊捨棄。
  例:-14 >>> 2 = (11111111 11111111 11111111 111100==10==) >>> 2 = (==00==111111 11111111 11111111 11111100) = 1073741820
二、Java內置的進制轉換
這裏寫圖片描述

對於原碼, 反碼, 補碼而言, 需要注意以下幾點:

(1).Java中沒有無符號數, 換言之, Java中的數都是有符號的;

(2).二進制的最高位是符號位, 0表示正數, 1表示負數;

(3).正數的原碼, 反碼, 補碼都一樣;

(4).負數的反碼=它的原碼符號位不變, 其他位取反;

(5).負數的補碼=它的反碼+1;

(6).0的反碼, 補碼都是0;

(7).在計算機運算的時候, 都是以補碼的方式來運算的.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章