只使用按位运算符添加两个整数?
在C#中,是否有可能执行两个32位整数的总和而不使用像if,elses,loops等东西?
也就是说,只能使用按位运算OR,AND,XOR,NOT,左移,右移?
这是你的娱乐的一个例子
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; }
循环可以展开。 执行的次数取决于操作数中设置的位数,但不会大于unsigned int
的宽度。 一旦carry
变为0
,下一次迭代不会改变任何东西。
尝试这个:
private int add(int a, int b) { if(b == 0) return a; return add( a ^ b, (a & b) << 1); }
编辑:更正if
语句
想想如何一点一滴地发生。 将值依次移到每个操作数的每一位,然后查看这两个位的四个可能的值,并计算出结果位应该是什么,以及是否有进位位。 然后看看如何使用按位运算来计算结果和进位。
public static int getSum(int p, int q) { int carry=0, result =0; for(int i=0; i<32; i++) { int n1 = (p & (1<<(i)))>>(i); //find the nth bit of p int n2 = (q & (1<<(i)))>>(i); //find the nth bit of q int s = n1 ^ n2 ^ carry; //sum of bits carry = (carry==0) ? (n1&n2): (n1 | n2); //calculate the carry for next step result = result | (s<<(i)); //calculate resultant bit } return result; }
以32位作为int需要32位。 谢谢!!!
static int binaryadd(int x, int y) { while (x != 0) { int c = y & x; y = y ^ x; x = c << 1; } return y; }
int b = 25; for (int t = 128; t > 0; t = t / 2) { if ((b & t) != 0) Console.Write("1 "); if ((b & t) == 0) Console.Write("0 "); } Console.WriteLine(); //b = (sbyte)~b; int e = 22; for (int t = 128; t > 0; t = t / 2) { if ((e & t) != 0) Console.Write("1 "); if ((e & t) == 0) Console.Write("0 "); } Console.WriteLine(); int c = b | e; for (int t = 128; t > 0; t = t / 2) { if ((c & t) != 0) Console.Write("1 "); if ((c & t) == 0) Console.Write("0 "); }