当前位置: 首页 > 面试题库 >

为什么此加法代码(使用按位运算)在Java中起作用

沙宣
2023-03-14
问题内容

public int add(int a, int b){
while (b != 0){
int carry = (a & b) ;

            a = a ^ b;

            b = carry << 1;
        }
        return a;
 }

这是使用按位运算来计算两个整数之和的代码。

如果我手动/编程计算,我会看到它适用于每个整数。但是我无法弄清楚a和之间的中间值之间的任何关系carry。为什么将进位乘以2分配给b

PS:我在Java中找到了一个按位乘法和 加法的答案,但这是乘法而不是加法。


问题答案:

小学的第一次回忆回忆。例如26 + 147 =173。您从6 + 7 = 13开始,因此将3加到总和中并携带一位,依此类推-
也就是说:您将两位数字相加并在必要时携带一位。

carry:  1
a:      26
b:     147
-----------------
sum:   173

该代码在二进制数字上几乎执行相同的操作,但稍有调整。一次只能完成一个数字位置,而不是一次位。该代码没有在i中包括位置i-1的进位(即,在将2和4相加时包括1),而是在第二次迭代中添加了所有龋齿。所以它的作用是:026+147 = 163 + 010 = 173 + 000

对于二进制数a = 6 = 00110和b = 7 = 00111您将获得

首先,您要找到携带物;这是所有的位置都在那里a,并b有其位设置:int carry = (a & b) ;

然后,id将数字加法,忽略进位,并将其存储在中aa = a ^ b;这将6+7=3示例中进行响应。

最后一部分将进位转移到下一个数字位置,即确保示例中的1进位从1移到10。 carry << 1;

只要总和中未包含进位,while循环就会继续。



 类似资料:
  • 问题内容: 我正在通过Daniel liang在第9章“字符串”中的“ Java编程第9版简介”来学习Java,我遇到了这段代码: 好吧,有人可以解释一下这里发生了什么吗?如何从整数中添加子字符,其背后的含义是什么,谢谢。 问题答案: 来自文档 char数据类型是单个16位Unicode字符。 A 由其代码点值表示: 分钟(或0) 最多:(或65,535) 您可以在ASCII表上看到所有英文字母代

  • 问题内容: 我正在使用PHP的用户角色/权限系统来编写脚本。 下面是使用位掩码方法获得phpbuilder.com权限的代码。 在该部分下面是一个简单得多的版本,w3hich可以在几乎没有该部分的情况下完成相同的操作。 许多人建议使用位运算符,例如PHP中的设置和其他内容,但我从来不明白为什么。在下面的代码中,使用第一个代码而不是第二个代码有什么 好处 ? 非位版本 问题答案: 为什么不这样做呢?

  • 问题内容: 我已经准备好参加Java认证考试,并且在其中一项练习测试中看到了类似的代码: 我的问题是…在方法外用花括号编写代码是否有效?这些(如果有)有什么影响? 问题答案: 从这里借来的- 通常,您需要将代码放在构造函数中以初始化实例变量。使用构造函数初始化实例变量有两种选择:初始化块和final方法。实例变量的初始化块看起来像静态初始化块,但没有static关键字: Java编译器将初始化程序

  • 问题内容: 我正在用Java编写电台代码,并且正在使用一个线程来当然播放流。我在线程的run方法中有一个while循环,该循环检查名为ShouldPlay的变量是否为true,以及是否运行该变量。播放器。然后,我有一个pause()方法,将变量设置为false,并且自然希望它在变量为false时不运行播放器。我创建了一个小示例,说明如何在下面进行设置: 我想发生的事情是,当线程首次运行时,它应该打

  • 问题内容: 我正在研究《 Beginning Android Games》 这本书。我注意到的一件事是: 这是我第一次看到这样的变量,所以我不知道它的作用。我在Java中运行代码并创建了一些示例。 如果我运行此代码: 答案将是0?这是为什么? 如果我运行此代码: 起初,我认为这是价值的串联,因此我假设i = 10500,但事实并非如此。答案是一样的。还是0?有人知道这里发生了什么吗? 问题答案: