首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按位添加在Java上工作,但在Ruby上失败

问按位添加在Java上工作,但在Ruby上失败
EN

Stack Overflow用户
提问于 2016-07-28 04:03:31
回答 1查看 56关注 0票数 0

我在阅读LeetCode上的问题时发现了这样一个问题:

“计算两个整数a和b的和,但不允许使用运算符+和-”

这是网上常见的问题。

这个问题的Java解决方案是:

代码语言:javascript
复制
public int getSum(int a, int b) {
   while(b!=0){
       int c = a&b;
       a=a^b;
       b=c<<1;
   } 
   return a;
}

效果很好。但是Ruby中的相同代码:

代码语言:javascript
复制
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有什么不同吗。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-07-28 05:06:49

在Java中,在整数变为零之前,可以向左移动固定次数的整数。这个次数是整数值的大小或位计数(对于int是32位)。

当b变为零时,您的循环就是这样在Java中中断的。

然而,在ruby中,一个数字在变为零之前可以左移多少次是没有限制的,因为在Ruby中没有固定的位计数。

这就是为什么b变得越来越大的原因(直到内存耗尽)。

也就是说,即使有正数,它也不应该工作,而且会有一个无限循环。

要打破这个无限循环,你可以用一个固定的精度来限制这个数字的精度和每个结果的精度。

代码语言:javascript
复制
precision = 0xFFFF;
b = (c << 1) & precision;

如果是负数,还有一个瓶颈。

由于FixNum没有固定的大小,它在按位运算后实际上假定负数为正数,所以即使2的补码中的1111是-1 ruby,它的正数为15。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38626904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档