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,下一次迭代不会改变任何东西.
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声明
想想加法如何一点一点地发生.移动值以依次获取每个操作数的每个位,然后查看两个位的四个可能值,并计算结果位应该是什么以及是否有进位位需要担心.然后看看如何使用按位运算来计算结果和进位.
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)
| 归档时间: |
|
| 查看次数: |
55438 次 |
| 最近记录: |