2012-06-06 59 views
100

我想了解換班人員,並沒有太多。 當我試圖執行下面的代碼移位操作符在Java中如何工作?

System.out.println(Integer.toBinaryString(2 << 11)); 
System.out.println(Integer.toBinaryString(2 << 22)); 
System.out.println(Integer.toBinaryString(2 << 33)); 
System.out.println(Integer.toBinaryString(2 << 44)); 
System.out.println(Integer.toBinaryString(2 << 55)); 

我得到以下

1000000000000  
100000000000000000000000  
100  
10000000000000  
1000000000000000000000000  

可能有人請解釋一下嗎?

+14

左移相同乘以2,而右移是整數除以2 – m0skit0

回答

162
System.out.println(Integer.toBinaryString(2 << 11)); 

將二進制2(10)向左移動11次。因此:1000000000000

System.out.println(Integer.toBinaryString(2 << 22)); 

位移二進制2(10)通過22倍到左邊。因此:100000000000000000000000

System.out.println(Integer.toBinaryString(2 << 33)); 

現在,int是4個字節,因此32位。所以,當你做了33的移位,相當於移位了1.因此:100

+3

Java定義了將掩碼(環繞)到0-31範圍的移位,而不是飽和到32(如果僅移位32,只剩下零)。 (顯然,例如使用32位類型)。我假定做出這個決定是爲了匹配x86移位和旋轉指令的行爲。相比之下,在C中,通過'count> = type width'移動是未定義的行爲。 (請參閱http://stackoverflow.com/questions/776508/best-practices-for-circular-shift-rotate-operations-in-c,瞭解編碼安全旋轉所需的解決方法。) –

+0

它是什麼目的雖然?就像我現在看不到使用位的使用一樣,除非你喜歡使用機器語言或其他東西? – carinlynchin

28

2以二進制十進制編號系統如下

10 

現在,如果你做

2 << 11 

這將是11個0會在右側進行填充

1000000000000 

簽名的左移運算符「< <「將位模式向左移位,並且帶符號的右移位運算符」>>「將位模式向右移位。位模式由左側操作數給出,並由右側操作數移動位置數量。無符號的向右移位運算符「>>>」移位零到最左邊的位置,而後「>>」最左邊的位置取決於符號擴展[..]

向左移位2在相乘結果(* 2)在二進制10條款或算術


例如

2,如果你這樣做<<1這將是100這是4

二進制100 4,如果你這樣做<<1這將是1000這是8


請參見

+0

也許值得強調的是「在*二進制形式* 2是......」 – adarshr

+0

@adarshr是

+0

''是好戲! :) – adarshr

2

它將位轉移通過填補許多0's

對於離,

  • 二進制10它是由2位2左移是1000其是數字8
  • 二進制10其是由3位2左移是10000其是數字16
13

左右輪班在這裏以相同的方式工作如何右移工作; 右移: 右移操作符>>將值中的所有位向右移動指定的次數。它的一般形式如下:

value >> num 

這裏,num指定將值移位的位置數。也就是說,>>將指定值中的所有位向右移動num指定的位位數。 下面的代碼片斷由兩個位置移位值32到右側,從而產生被設置爲8:

int a = 32; 
a = a >> 2; // a now contains 8 

當一個值具有被「移離」的那些比特被丟失比特。例如,下一個代碼片段將這個值35到右側的兩個位置,這會導致丟失兩個低位比特,在被設置爲8。

int a = 35; 
a = a >> 2; // a still contains 8 

看着相同的操作再次導致在二元更清楚地表明這是如何發生的:

00100011 35 >> 2 
00001000 8 

每次一個值向右移動時,它通過劃分該值兩並丟棄所有剩餘部分。你可以利用這個優勢來進行2的高性能整數除法。當然,你必須確定你沒有將任何位移出右端。 當你向右移動時,右移位暴露的頂部(最左邊)位用頂部位的前一個內容填充。這稱爲符號擴展,用於在正確移位時保留負數的符號。例如,–8 >> 1–4,其中,二進制,是

11111000 –8 >>1 
11111100 –4 

有趣的是,要注意,如果你轉移1右,結果始終保持-1,因爲符號擴展將保持在較爲者高位。 有時,當您將它們移到右側時,不要求符號擴展值。例如,以下程序將字節值轉換爲其十六進制字符串表示形式。請注意,移位後的值通過與0x0f進行AND操作來屏蔽掉任何符號擴展位,以便該值可用作十六進制字符數組的索引。

// Masking sign extension. 
class HexByte { 
    static public void main(String args[]) { 
    char hex[] = { 
     '0', '1', '2', '3', '4', '5', '6', '7', 
     '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' 
    }; 
    byte b = (byte) 0xf1; 
System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]); 
} 
} 

下面是該程序的輸出:

b = 0xf1 
11

我相信這可能幫助:

System.out.println(Integer.toBinaryString(2 << 0)); 
    System.out.println(Integer.toBinaryString(2 << 1)); 
    System.out.println(Integer.toBinaryString(2 << 2)); 
    System.out.println(Integer.toBinaryString(2 << 3)); 
    System.out.println(Integer.toBinaryString(2 << 4)); 
    System.out.println(Integer.toBinaryString(2 << 5)); 

結果

10 
    100 
    1000 
    10000 
    100000 
    1000000 

編輯:

Must Read This (how-do-the-bitwise-shift-operators-work)

+0

您必須首選此循環。 – 2014-09-10 04:10:23

+4

是的。確實。我只是想保持簡單的理解。 – Hashmap

2

移位可以與數據類型(字符型,int和長整型)實現。 float和double數據不會被移動。

value= value >> steps // Right shift, signed data. 
value= value << steps // Left shift, signed data. 
6

我認爲這將是以下內容,例如:

  • 簽名左移

[2 < < 1]是=> [10(2個二進制)在二進制串的末尾添加1零]因此10將成爲100,其變爲4.

簽名左移使用乘法... 因此,這也可以被計算爲2 *(2^1)= 4 又如[ < < 11] = *(2^11)= 4096

  • 簽名右移

[4 >> 1]是=> [100(4二進制)在二進制串的末尾去除1零]因此100將是10,它變爲2。

簽名右移使用除法... 因此,這也可以被計算爲4 /(2^1)= 2 又如[ >> 11] = /(2^11)= 2