簡單的我們知道左移一位表示乘以2,像1<<2=4。但是左移個幾百位呢?1<<100=??
一個int佔32位,一個long才佔64位,左移幾百位真要乘這麼多2的話,肯定是存不下的。比如以下代碼:
System.out.println("1 << 100 = " + (1 << 100));
System.out.println("1L << 100 = " + (1L << 100));
按照我們的猜測的話,左移高位可能會被捨棄,所以只要左移超過最大的位數結果應該是0,但是上述代碼的結果爲:
1 << 100 = 16 1L << 100 = 68719476736
我們看到,100位已經超過int和long的最大位數了,但是左移的結果並不是0。根據結果我們能猜的出來,虛擬機在做移位操作的時候對移位位數根據當前數據類型做了取餘操作。也就是如果是int類型變量左移,會把需要左移的位數和32取餘,long類型變量則會根據64位取餘:
1 << n == 1 << (n % 32)
1L << n == 1 << (n % 64)
我們看一下以下代碼:
System.out.println("1 << (100 % 32) = " + (1 << (100 % 32)));
System.out.println("1 << 100 = " + (1 << 100));
System.out.println("1L << 100 = " + (1L << 100));
System.out.println("1L << (100 % 64) = " + (1L << (100 % 64)));
輸出爲:
1 << (100 % 32) = 16
1 << 100 = 16
1L << 100 = 68719476736
1L << (100 % 64) = 68719476736
注:特別要注意,像byte類型的變量在做移位等操作的時候會將其轉換爲int,所以在操作的時候需要注意。感興趣的同學可以試驗一下。