仅使用按位运算符添加两个整数?

Del*_*lta 41 c# bit-manipulation

在C#中,是否可以在不使用if..else,循环等的情况下执行两个32位整数的和?

也就是说,是否可以仅使用按位运算OR(|),AND(&),XOR(^),NOT(!),shift left(<<)和shift right(>>)来完成?

Mac*_*ehl 64

这是您娱乐的一个例子

unsigned int myAdd(unsigned int a, unsigned int b)
{
    unsigned int carry = a & b;
    unsigned int result = a ^ b;
    while(carry != 0)
    {
        unsigned int shiftedcarry = carry << 1;
        carry = result & shiftedcarry;
        result ^= shiftedcarry;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

循环可以展开.它执行的次数取决于操作数中设置的位数,但它永远不会超过宽度unsigned int.一旦carry变为0,下一次迭代不会改变任何东西.

  • 谢谢.这就是我想要的.现在我要试着理解为什么会这样.TY (3认同)

Sha*_*one 23

试试这个:

    private int add(int a, int b) {
        if(b == 0)
            return a;

        return add( a ^ b, (a & b) << 1);
    }
Run Code Online (Sandbox Code Playgroud)

编辑: 更正的if声明

  • 我们是否需要在这里使用 if 语句,当 b = 0 时,a^b = a 从而结果保持不变。 (2认同)
  • @Anirudh,是的。您需要该基本情况才能结束递归。 (2认同)

The*_*aul 7

想想加法如何一点一点地发生.移动值以依次获取每个操作数的每个位,然后查看两个位的四个可能值,并计算结果位应该是什么以及是否有进位位需要担心.然后看看如何使用按位运算来计算结果和进位.


stt*_*106 5

static int binaryadd(int x, int y)
{
  while (x != 0)
  {
    int c = y & x;
    y = y ^ x; 
    x = c << 1;             
  }
  return y;
}
Run Code Online (Sandbox Code Playgroud)