Java 两个数字相加的位运算?

Java 两个数字相加的位运算?,java,bit-manipulation,Java,Bit Manipulation,所以如果我有一个1号和另一个2号。。这两个整数,我用位运算加两个数的方法正确吗?对于任何测试用例,这会出错吗 public int add(int number1, int number2) { int carry = (number1&number2)<<1; int sum = number1^number2^carry; return sum; } public int add(int number1,int number2) { int carry=(number1

所以如果我有一个1号和另一个2号。。这两个整数,我用位运算加两个数的方法正确吗?对于任何测试用例,这会出错吗

public int add(int number1, int number2)
{
int carry = (number1&number2)<<1;
int sum = number1^number2^carry;
return sum;
}
public int add(int number1,int number2)
{

int carry=(number1和number2)是。这种方法不适用于涉及多个进位的加法运算。最简单的这种情况是
3+1
;您的函数结果是
0

没有简单的通用解决方案可以解决这个问题——任何解决方案都必须考虑整数的宽度。有关一些方法,请参阅。

这里是一个电路设计者如何添加两个数字。翻译时,双弯曲左边缘上的两个符号是XOR(^),中间的两个具有平坦的左边缘是(和),最后一个具有左弯曲边的是(或)(<)/< 现在,下面是如何使用掩码将其转换为代码,一次一位

public int add(final int A, final int B) {
    int mask = 1; 
    int sum = 0;
    int carry = 0;

    for (int i = 1; i <= Integer.SIZE; i++) { //JVM uses 32-bit int
        int a = A & mask; //bit selection
        int b = B & mask;

        //sum uses |= to preserve the history,
        //but carry does not need to, so it uses =
        sum |= a ^ b ^ carry; //essentially, is the sum of bits odd?
        carry = ((a & b) | ((a ^ b) & carry)) << 1; //are exactly two of them 1?

        mask <<= 1; //move on to the next bit
    }
    return sum;
}
public int add(最终int A,最终int B){
int-mask=1;
整数和=0;
整数进位=0;

对于(inti=1;i是的,它会出错。我们可以使用
while
循环。下面是代码

static int addTwoNumbers(int a, int b)
{
   int carryNum;

   while(b ! =  0)
   {
      carryNum = a & b;
      a = a ^ b;
      b = carryNum << 1;
   }
   return a;
}
静态整数addTwoNumber(整数a、整数b)
{
内角叉菜属;
而(b!=0)
{
carryNum=a&b;
a=a^b;

b=carryNum这是用JavaScript编写的,但现在开始

function add(number1,number2){
    var a = number1,b = number2,c;
    while(b != 0){
        c = a & b;
        a = a ^ b;
        b = c << 1;
    }
    return a;
}
函数添加(number1,number2){
变量a=number1,b=number2,c;
而(b!=0){
c=a&b;
a=a^b;

b=c如果你插入一些非平凡的数字,你就会意识到这是错误的。加法器需要一个接一个地链接。(提示:你需要一个循环)你能举一个这两个数字的例子吗?
3+1
,就像目前为止的答案一样。任何带有链式进位的数字都是错误的,
63+1
127+1
,等等。写一个单元测试,看看你自己。不工作。我检查了3和9,得到了12。另外,它对负+正都不工作。对正和负都有效如果翻译成python,测试超过500个值的负值在
-12
-8
上失败。您能证明您的方法产生正确的结果吗?