问题描述
他写了这个声明
count -= (1 << ((length - 1) / 2));
我无法理解。
考虑如果我将长度传递为 1,为什么这个语句不会抛出 ArithmeticException
对于 0 / 2。
我错过了这里的核心基础。 请帮帮我。
这里是完整的代码供参考:
public int solve(int A) {
if(A == 0)
return 0;
int result = 1;
int length = 1;
int count = 1;
while(count < A) {
length++;
count += (1 << ((length - 1) / 2));
}
count -= (1 << ((length - 1) / 2));
int offset = A - count - 1;
result |= (1 << (length - 1));
result |= offset << (length / 2);
int halfShiftednumber = (result >> (length / 2));
int reversednumber = getReversednumber(halfShiftednumber);
result |= reversednumber;
return result;
}
int getReversednumber(int A) {
int result = 0;
while(A > 0) {
int lsb = (A & 1);
result |= lsb;
result = result << 1;
A = A >> 1;
}
result = result >> 1;
return result;
}
如果我将 1 作为输入传递给函数会怎样……它应该抛出 ArithmeticException。 但它不是..
谁能帮我解释一下这些基本的东西。
谢谢!
解决方法
0 / NaturalNumber
是一个有效的数学运算,将产生 0
。所以编程语言支持操作。 (这也适用于负数和浮点数)
在相关上下文中,0
作为分母是未定义的。
因此,对于 AnyNumber / 0
操作,编程语言可以抛出异常。
需要考虑的问题
请注意,当长度为零或负数时(因此 length-1
为负数),则会导致意外结果。
- 在整数的上下文中,
somenumber << -value
类似于somenumber << ((32 - value) % 32)
- 在long的上下文中,
somenumber << -value
类似于somenumber << ((64 - value) % 64)