左右輪班在這裏以相同的方式工作如何右移工作; 右移: 右移操作符>>將值中的所有位向右移動指定的次數。它的一般形式如下:
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
左移相同乘以2,而右移是整數除以2 – m0skit0