LeetCode竞赛代码中ret[(int) b[i]] = p;为何无溢出?
为什么
ret[(int) b[i]] = p;不会发生溢出? 先看代码里b[i]的构造逻辑:
b[i] = (long) a[i] << 32 | i;
这行代码做了两个关键操作:
- 把
a[i]转为long后左移32位,这会把a[i]的内容放到long值的高32位,低32位全部补0。 - 和原数组的索引
i做按位或运算——i是int类型,取值范围是0到n-1(n是原数组长度),它的二进制仅占用低32位,所以按位或之后,b[i]的低32位就是原索引i的值,高32位则保留a[i]的信息。
当执行(int) b[i]强制类型转换时,Java会直接截取long值的低32位作为int结果,这部分刚好就是原本的索引i。而ret数组的长度是n,i的取值范围完全在ret数组的合法索引区间(0到n-1)内,所以作为数组索引使用时,既不会出现数值溢出,也不会触发数组越界异常。
内容的提问来源于stack exchange,提问作者Md Sajid Anwar
相关产品推荐
相关产品推荐

