2010-10-13 54 views

回答

26

計算機是二進制設備。因此,數字由1和0的序列表示。

移位僅僅是向左或向右移動1和0的序列。

所以所有的>>運算符都是將位向右移動一位。

考慮數101:

// Assuming signed 8-bit integers 
01100101 // How 101 is represented in binary 
00110010 // After right shifting one bit, this represents 50 

在這種情況下,至少顯著位被截斷。顯然魔鬼的細節,但這就是真的。

<<操作者確實相反的操作:

// Assuming signed 8-bit integers 
01100101 // How 101 is represented in binary 
11001010 // After left shifting one bit, this represents -54 

// Assuming unsigned 8-bit integers 
01100101 // How 101 is represented in binary 
11001010 // After left shifting one bit, this represents 202 

在這種情況下,最顯著位被截斷,因爲我只使用8位。如果數字有更多的位,但是:

// Assuming signed 16-bit integers 
00000000 01100101 // How 101 is represented in binary 
00000000 11001010 // After left shifting one bit, this represents 202 
00000001 10010100 // After left shifting one bit again, this represents 404 

所以,你可能取決於有多少位,並與您處理這些位相關的數據類型得到不同的數字。

附錄:如果你想知道的二進制工作原理,想想是十進制系統是如何工作的。認爲這是可以這樣寫的號碼5287.:

5287 

但你也可以寫出來是這樣的:

5287 = (5 * 1000) + (2 * 100) + (8 * 10) + (7 * 1) 

然後你就可以寫出這樣的:

5287 = (5 * 10^3) + (2 * 10^2) + (8 * 10^1) + (7 * 10^0) 

上面的等式解釋了爲什麼十進制數系統有時被稱爲base-10系統。十進制數系統使用10位數字(0-9)。注意指數如何對應數字位置。

二進制數字系統或base-2系統是完全相同的東西,但以數字2作爲指數的基數,只使用兩個數字:0和1。

5287 = 00010100 10100111 (base 2) 
    = (0 * 2^15) + (0 * 2^14) + (0 * 2^13) + (1 * 2^12) 
    + (0 * 2^11) + (1 * 2^10) + (0 * 2^9) + (0 * 2^8) 
    + (1 * 2^7) + (0 * 2^6) + (1 * 2^5) + (0 * 2^4) 
    + (0 * 2^3) + (1 * 2^2) + (1 * 2^1) + (1 * 2^0) 
+3

實際上,它除以兩個,並且由兩個中的另一個相乘。 – 2010-10-13 11:37:49

+2

@Joeri Hendrickx:對於整數,實際上'''實際上是相同的除以2(它輪迴取決於確切的格式)和'<<'實際上是相同的乘以二。如果您需要在沒有乘法/除法指令的處理器上進行乘/除,那麼這是一個有用的「技巧」。請記住,這個技巧只適用於整數。試圖在浮點數上使用這個技巧會導致垃圾。 – 2010-10-13 19:44:07

3

>>SHIFT RIGHT操作者

實施例:

class X 
     { 
     public static void main(String args[]) 
     { 
     System.out.println("20>>2 = "+20>>2); 
     } 
     }   

輸出:20>>2 = 5

說明:

20

二進制值是:00000000000000000000000000010100

移所有位2位置向右00000000000000000000000000000101

它會給52*2^2+0*2^1+1*2^0

3

我可以假設我說的就是孩子知道一些關於二進制? :)

所有數字可以在某種二進制來表示,像這樣:

Base 10 : Base 2 
    1 : 0001 
    2 : 0010 
    3 : 0011 
    4 : 0100 
    5 : 0101 
    6 : 0110 
    7 : 0111 
    8 : 1000 

... 等。

移位運算符基本上將所有位(1或0)跨越一個位置的。因此,舉例來說: 000111 >> 1

轉移所有位在右000111一個號碼產生這樣的:

轉移所有位向左由一個,產生此:

如果你轉移不止一個,那麼它只是進一步移動這些位。現在

,這取決於你使用的是什麼語言,那種你正在使用的數字,它可以是一個有點複雜多了。例如,如果你是在一個語言工作,其中「最顯著位」(最遠的一個在若干左)代表的數量是有符號還是不行,那麼語言將不得不考慮到這一點。在數學上,如果你取一個整數(並忽略溢出的風險,這是由於計算機空間不足以存儲位造成的),向左移1(< < 1)等於乘以2,右移1等於除以2.(想想關於二進制數學中的「地點值」是多少值得的,那會有道理的)

0

我曾經寫過an JApplet (bitorgel) and put it on my web page,其中一個可以和位操作員一起玩。你可以試試它,或者下載源代碼。 AFAIK他們在C,C++和Java中的工作方式都是一樣的 - 也許在C#中也是如此。