好吧,我試圖尋找了一下>>,或轉移手段,但它的方式在我的頭上,因爲這網站解釋它:http://www.janeg.ca/scjp/oper/shift.html>>在java中做什麼?
所以有人可以解釋它像他們說話的孩子嗎?
好吧,我試圖尋找了一下>>,或轉移手段,但它的方式在我的頭上,因爲這網站解釋它:http://www.janeg.ca/scjp/oper/shift.html>>在java中做什麼?
所以有人可以解釋它像他們說話的孩子嗎?
計算機是二進制設備。因此,數字由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)
>>
的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
(2*2^2+0*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一個號碼產生這樣的:
轉移所有位向左由一個,產生此:
如果你轉移不止一個,那麼它只是進一步移動這些位。現在
,這取決於你使用的是什麼語言,那種你正在使用的數字,它可以是一個有點複雜多了。例如,如果你是在一個語言工作,其中「最顯著位」(最遠的一個在若干左)代表的數量是有符號還是不行,那麼語言將不得不考慮到這一點。在數學上,如果你取一個整數(並忽略溢出的風險,這是由於計算機空間不足以存儲位造成的),向左移1(< < 1)等於乘以2,右移1等於除以2.(想想關於二進制數學中的「地點值」是多少值得的,那會有道理的)
我曾經寫過an JApplet (bitorgel) and put it on my web page,其中一個可以和位操作員一起玩。你可以試試它,或者下載源代碼。 AFAIK他們在C,C++和Java中的工作方式都是一樣的 - 也許在C#中也是如此。
實際上,它除以兩個,並且由兩個中的另一個相乘。 – 2010-10-13 11:37:49
@Joeri Hendrickx:對於整數,實際上'''實際上是相同的除以2(它輪迴取決於確切的格式)和'<<'實際上是相同的乘以二。如果您需要在沒有乘法/除法指令的處理器上進行乘/除,那麼這是一個有用的「技巧」。請記住,這個技巧只適用於整數。試圖在浮點數上使用這個技巧會導致垃圾。 – 2010-10-13 19:44:07