Aas*_*war 4 java arrays bit-manipulation
我知道java中任何数组的最大大小是Integer.maxValue。因为数组是 int 索引的。但我知道,我们也可以使用移位运算符初始化数组。我试过了,但它抛出了奇怪的输出。
int arr[] = new int[1<<5];
System.out.println(arr.length);
arr = new int[1<<10];
System.out.println(arr.length);
arr = new int[1<<20];
System.out.println(arr.length);
arr = new int[1<<25];
System.out.println(arr.length);
arr = new int[1<<40];
System.out.println(arr.length);
arr = new int[1<<111];
System.out.println(arr.length);
Run Code Online (Sandbox Code Playgroud)
我预计每移动 n 次,数组的结果大小将为 2^n。
32
1024
1048576
33554432
256
32768
Run Code Online (Sandbox Code Playgroud)
因此,如果有任何其他方法可以在适当的大小分配中初始化这样的数组,是否可以通过移动 1100 次来初始化大小为 2^100 的数组?
您会看到由于溢出而System.out.println(1 << 40);打印256。在 Java 中int溢出所以Integer.MAX_VALUE + 1等于Integer.MIN_VALUE.
你可以尝试做这样的事情:
int[] arr = new int[1 << 100];
Run Code Online (Sandbox Code Playgroud)
但是因为两个操作数都是类型int,所以结果也将是int. 由于溢出,它将不是 2^100,而是 16。
如果您尝试让 JVM 将结果转换为long执行以下操作
int[] arr = new int[1L << 100];
Run Code Online (Sandbox Code Playgroud)
你会得到编译错误,因为数组的长度应该是类型int。