在C#中,是否可以在不使用if..else,循环等的情况下执行两个32位整数的总和?
也就是说,是否可以仅使用按位运算OR(|
),AND(&
),XOR(^
),NOT(!
)来完成,向左移动(<<
)并向右移动(>>
)?
答案 0 :(得分:58)
以下是您娱乐的一个例子
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
,下一次迭代就不会改变任何内容。
答案 1 :(得分:21)
试试这个:
private int add(int a, int b) {
if(b == 0)
return a;
return add( a ^ b, (a & b) << 1);
}
修改强>
已更正if
声明
答案 2 :(得分:6)
考虑一下加法如何发生。移动值以依次获取每个操作数的每个位,然后查看两个位的四个可能值,并计算结果位应该是什么以及是否有进位位需要担心。然后看看如何使用按位运算来计算结果和进位。
答案 3 :(得分:2)
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位。感谢!!!
答案 4 :(得分:2)
static int binaryadd(int x, int y)
{
while (x != 0)
{
int c = y & x;
y = y ^ x;
x = c << 1;
}
return y;
}
答案 5 :(得分:0)
int Add(int a, int b)
{
int result = 0,
// carry now contains common set bits of "a" and "b"
carry = a & b;
if (Convert.ToBoolean(carry))
{
// Sum of bits of "a" and "b" where at least one
// of the bits is not set
result = a ^ b;
// carry is shifted by one so that adding it
// to "a" gives the required sum
carry = carry << 1;
result = add(carry, result);
}
else
{
result = a ^ b;
}
return result;
}
可以使用XOR ^
运算符执行两位的总和,并且可以使用AND &
运算符获得进位。
假设a
和b
没有在同一位置设置位,则使用^
运算符得出a
和b
的总和。
答案 6 :(得分:-5)
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 ");
}