为什么我必须为位掩码声明一个长变量?

35g0bw71  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(400)

https://leetcode.com/problems/number-complement/
下面是这个问题的两个有效解决方案,为什么我在第一个解决方案中遇到整数溢出 mask 变量应该是int(而不是long),为什么我可以用int变量类型作为 mask 在第二种解决方案中

public int findComplement(int num) {

    // Make a copy of the number for length estimation purposes , because we will begin mutating it
    // directly
    int input = num;

    // Use a power of two mask to bring 1 at every position and flip in stages using XOR
    for (long mask = 1; mask <= input; mask *= 2) {
      num = (int) (num ^ mask);
    }

    return num;
  }
public int findComplement2(int num) {

    int save = num; 
    int mask = 1;

    while (save != 0) {
        num = num ^ mask;
        mask = mask << 1;
        save = save >> 1;
    }

   return num;

}
nwlqm0z1

nwlqm0z11#

你的身体状况 for 循环设置要求 mask 必须大于的值 input 终止。但是,当你使用 Integer.MAX_VALUE 作为输入,将没有其他 int 值大于 Integer.MAX_VALUE ,这将阻止 for 循环。所以你的 for 循环将永远运行,因为

for(/* */, mask <= Integer.MAX_VALUE, /* */) {
}

将永远 true 如果变量 mask 属于类型 int (或更小)。
为了阻止 for 循环必须使用类型 long 对于变量 mask 所以有可能 mask <= input 将导致 false 如果输入值 Integer.MAX_VALUE 已使用。
在第二个方法中,还可以在整数溢出中运行 mask 将从1073741824跳到-2147483648。但是,在这种情况下 save 将为零,终止 while 循环 save != 0 检查。所以事实上 mask 如果整数溢出为负,则没有任何后果。

相关问题