万同学提出了一个问题,怎么不用+号实现a+b。
这其实是一个组成原理的问题,也就时加法器是如何实现的。在计算机中,所有的数字都是二进制数进行存储的,你看到的十进制数,实际上是做了做了转换,才让你看的见。所以可以直接使用位运算符号操作两个加数。
附上万同学的源代码:
int sumab(int a, int b)
{
if (a == 0)
return b;
if (b == 0)
return a;
int sum = 0;
int carry = 0; 进位标志
int temp = 0; 当前位
int s = 0;
for (int i = 0; i < 32; i++)
{
int tempa = a & 1;
int tempb = b & 1;
if (1 == (tempa & tempb & carry)) //3 java中 不存在 0就是false 就是它int和boolean不能转化
{
carry = 1;
temp = 1;
}
else if (1 == (tempa & tempb | tempb & carry | tempa & carry)) //2
{
temp = 0;
carry = 1;
}
else if (1 == (tempa | tempb | carry))//1/
{
temp = 1;
carry = 0;
}
else
{
temp = 0;
carry = 0;
}
s = carry << (i + 1); /
if (i == 31)这个进位不能超
s = 0;
sum = sum | (temp << i);
a >>= 1;
b >>= 1;
}
return sum | s;
}
另外这个博主写的很有参考意义:
int main()
{
int a, b, c;
scanf("%d%d", &a, &b);
c = a & b;
while (c != 0)
{
a = a ^ b;
b = c << 1;
c = a & b;
}
printf("%d", a | b);
return 0;
}