簡體   English   中英

>> 在 Java 中有什么作用?

[英]What does >> do in Java?

好的,我嘗試查找>>或 shift 的含義,但正如本網站所解釋的那樣,這超出了我的理解: http : //www.janeg.ca/scjp/oper/shift.html

如果和孩子說話,解釋會是什么?

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

Bitshifting 只是將這些 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)

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

二進制數字系統或基數 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)

我可以假設我正在與之交談的孩子對二進制有所了解嗎? :)

所有數字都可以用某種二進制表示,如下所示:

   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 中的所有位右移一個數字以產生以下結果:

000011

000111<<1

將所有這些位左移一,以產生這個:

001110

如果您移位不止一個,那么它只會進一步移動這些位。

現在,根據您使用的語言和您使用的數字類型,它可能比這更復雜一點。 例如,如果您使用一種語言,其中“最高有效位”(數字中最左邊的一位)代表數字是否有符號,則該語言必須考慮到這一點。

從數學上講,如果你取一個整數(並忽略溢出的風險,這是由計算機用完空間來存儲位引起的),左移 1 (<< 1) 相當於乘以 2,然后移位右除以 1 相當於除以 2。(想想二進制數學中的“位值”是多少,這是有道理的)

>> SHIFT RIGHT運算符

示例:

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

輸出: 20>>2 = 5

說明:

20二進制值是: 00000000000000000000000000010100

將所有位2位右移00000000000000000000000000000101

它會給5 ( 1*2^2 + 0*2^1 + 1*2^0 )

我曾經寫過一個 JApplet (bitorgel) 並將它放在我的網頁上,在那里人們可以玩弄位運算符。 您可以現場試用,或下載源代碼。 AFAIK 它們在 C、C++ 和 Java 中的工作方式相同 - 可能也在 C# 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM