java - 按位运算将两个数字相加?

标签 java bit-manipulation

因此,如果我有一个 number1 和另一个 number2 .. 都是整数,那么我使用按位运算将两个数字相加的方法是否正确?对于任何测试用例来说这都会出错吗?

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

最佳答案

Full Adder

以下是电路设计人员如何将两个数字相加。翻译一下,顶部具有双弯曲左边缘的两个符号是 XOR (^),中间具有平坦左边缘的两个符号是 AND (&),最后一个具有单弯曲左边缘的符号是 OR (|)。 )。

现在,以下是如何使用掩码将其转换为代码,一次一位。

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;
}

关于java - 按位运算将两个数字相加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12256948/

相关文章:

prolog - 在 SICStus Prolog 中使用 CLMUL

c++ - 添加无符号数而不使用 '+' 或 '++'

java - 检测在linux机器上运行的java程序

java - 使用jetty-runner时无法控制日志记录级别

java - CompareTo 函数问题

java - Spring 3.0找不到applicationcontext.xml

c - Bitshift 字符数组

c - 无重复创建二维数组的最佳方法

c# - 将整数中的一位与另一位交换,代码不起作用

java - 请提供 hibernate 条件中 If 语句的示例