2014-12-22 81 views
-6

我想了解一下的這部分代碼(它是一個IP掩碼)什麼是0xffffffff的和<<在java中

int mask = 0xffffffff << (32 - prefix); 
System.out.println("Prefix=" + prefix); 
System.out.println("Address=" + ip); 
int value = mask; 
byte[] bytes = new byte[]{ 
(byte)(value >>> 24), (byte)(value >> 16 & 0xff), 
(byte)(value >> 8 & 0xff), 
(byte)(value & 0xff) }; 
try { 
InetAddress netAddr = InetAddress.getByAddress(bytes); 
System.out.println("Mask=" + netAddr.getHostAddress()); 
+3

_「我希望有人可以在每行之後放置註釋」_ SO不是代碼翻譯服務。什麼部分不清楚?你搜索了什麼?請參閱http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html –

+1

[位移位運算符。簽名和無符號](http://stackoverflow.com/questions/2244387/bitwise-shift-operators-signed-and-unsigned) – Palpatim

回答

4

<<是向左移位運算符。 >>是右移操作符。您可以閱讀Java here中的位移。

0xffffffff是hexadecimal number

1

這些是十六進制數字和按位操作。

十六進制數字使用數字系統,基數爲16。因此0xffff指:

(((15*16+15)*16+15)*16+15)*16+15=65'535 

這主要是有用的,因爲一個半字節(一個十六進制數),恰好映射在四個比特。由於F1111二進制,因此0xffff表示1111 1111 1111 1111(或最後的16位是1)。

<<>>是按位算術移位。如果指定0xffff<<8,這意味着你八位移位數向左從而:

 1111 1111 1111 1111    ff ff ff ff 
<<      8    <<   8 
------------------------    -------------- 
1111 1111 1111 1111 0000    ff ff ff ff 00 

>>是在相反方向上的轉變,最高位也決定了新的位的在值剩下。如果左邊的位應該爲零,則需要使用邏輯右移>>>)。

其他位操作包括|&~^(不要與&&||等混淆)。