public class Shift { public static void main(String[] args) { for(int i = 0; i < Integer.SIZE + 2; ++i) { System.out.printf("%08x%n", 1 << i); } } }
実行。
$ javac Shift.java $ java Shift 00000001 00000002 (中略) 40000000 80000000 00000001 00000002
えーっ!
型のビットサイズを超えてシフトしたら、ビットを押し出してくれることを期待したのに、まったくの予想外の挙動。
この挙動はシフトではありません。ローテイトです。
…。
…で済めばよかったんですが(いや、それで済んでもあんまりよくないですけど)。
public class Shift { public static void main(String[] args) { for(int i = 0; i < Integer.SIZE + 2; ++i) { System.out.printf("%08x%n", 3 << i); } } }
実行。
$ javac Shift.java $ java Shift 00000003 00000006 (中略) c0000000 80000000 00000003 00000006
…。
いや、それ、絶対おかしい。