我在阅读关于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中不是也一样吗你们知道鲁比有什么不同吗。
提前谢谢。

最佳答案

在Java中,整数在变为零之前可以左移固定次数这个次数是整数值的大小或位数(对于int,它是32位)。
这就是当b变为零时Java中的循环中断的方式。
然而在ruby中,一个数字在变为零之前可以左移多少次是没有限制的,因为ruby中的数字没有固定的位计数。
这就是为什么b会变大(可能直到我们的内存耗尽)。
这是它不应该工作,即使是正数和进入无限循环。
为了打破这个无限的循环,你可以用固定的精度来限制数字和每个结果的精度。

precision = 0xFFFF;
b = (c << 1) & precision;

如果是负数,还有一个瓶颈。
由于FixNum没有固定的大小,它实际上在按位运算后假定一个负数为正数,因此即使2的补码中有1111是-1,ruby也将其作为正数15。

07-24 09:49
查看更多