我在阅读LeetCode上的问题时发现了这样一个问题:
“计算两个整数a和b的和,但不允许使用运算符+和-”
这是网上常见的问题。
这个问题的Java解决方案是:
public int getSum(int a, int b) {
while(b!=0){
int c = a&b;
a=a^b;
b=c<<1;
}
return a;
}效果很好。但是Ruby中的相同代码:
def get_sum(a, b)
while b != 0 do
c = a & b;
a = a ^ b;
b = c << 1;
end
return a;
end不起作用。实际上,如果'a‘和'b’都是正数,但如果'a‘或'b’都是负数,则会失败。我怀疑这个问题与移动运营商有关,但在Java中不是也是这样吗?你们知道Ruby有什么不同吗。
提前谢谢。
发布于 2016-07-28 05:06:49
在Java中,在整数变为零之前,可以向左移动固定次数的整数。这个次数是整数值的大小或位计数(对于int是32位)。
当b变为零时,您的循环就是这样在Java中中断的。
然而,在ruby中,一个数字在变为零之前可以左移多少次是没有限制的,因为在Ruby中没有固定的位计数。
这就是为什么b变得越来越大的原因(直到内存耗尽)。
也就是说,即使有正数,它也不应该工作,而且会有一个无限循环。
要打破这个无限循环,你可以用一个固定的精度来限制这个数字的精度和每个结果的精度。
precision = 0xFFFF;
b = (c << 1) & precision;如果是负数,还有一个瓶颈。
由于FixNum没有固定的大小,它在按位运算后实际上假定负数为正数,所以即使2的补码中的1111是-1 ruby,它的正数为15。
https://stackoverflow.com/questions/38626904
复制相似问题