当我在while循环之外声明移位时,我得到的结果等于16,这是一个错误的答案。但是当我在while循环中声明它时,我得到了正确的答案结果== 11.差异如何改变答案?
long a = Math.abs((long)100);
long b = Math.abs((long)9);
int result = 0;
while (a >= b){
int shift = 0;
while(a >= (b<<shift)){
shift ++;
}
a -= b << (shift - 1);
result += 1 << (shift - 1);
}
答案 0 :(得分:2)
你声明它并不重要,实际上 - 重要的是何时以及是否将值重置为零。例如:
while (a >= b){
int shift = 0;
和
int shift;
while (a >= b){
shift = 0;
对于您的目的是相同的。但如果你改为这样做:
int shift = 0;
while (a >= b){
然后你没有在每个循环开始时将shift重置为0,并且会得到与前两个不同的答案。
答案 1 :(得分:0)
如果在外部while循环外定义移位,则只初始化一次。因此,外部while循环的每个新迭代都将使用上一次迭代的移位值(您执行更改值的shift ++
),即0, 1, 2,...
如果在外部while循环内声明移位,则在每次迭代时将其重置为0。因为结果取决于shift的值,所以声明的位置很重要。
答案 2 :(得分:0)
当您将移位变量声明为循环时。每次迭代时都不会重置为0。
但是当你每次遍历循环时把它放在循环中,它的值被设置为零(更具体地说,变量再次声明),使输出按预期进行。
这不是一件有效的事情。我建议你做的是在循环外声明你的变量并在循环中重置它的值,如下面的代码所示
long a = Math.abs((long)100);
long b = Math.abs((long)9);
int result = 0;
int shift = 0;
while (a >= b){
shift = 0;
while(a >= (b<<shift)){
shift ++;
}
a -= b << (shift - 1);
result += 1 << (shift - 1);
}
答案 3 :(得分:0)
变量的声明不是改变你的答案,而是你在外循环的每次迭代中将它设置为0
的事实。这是您要编写的代码:
long a = Math.abs((long)100);
long b = Math.abs((long)9);
int result = 0;
int shift = 0;
while (a >= b){
shift = 0;
while(a >= (b<<shift)){
shift ++;
}
a -= b << (shift - 1);
result += 1 << (shift - 1);
}