/*
加法运算
将一个整数用二进制表示,其加法运算就是:
相异(^)时,本位为1,进位为0;
同为1时本位为0,进位为1;
同为0时,本位进位均为0。
*/
//加法(递归法)
int _BitAdd(int a, int b)
{
return b ? _BitAdd(a^b, (a&b)<<1) : a; //a^b 不计进位的和,(a&b)<<1 进位
/*
if (b == 0)
return a;
return _BitAdd(a^b, (a&b)<<1); //a^b 不计进位的和,(a&b)<<1 进位
*/
}
//加法(迭代法)
int _BitAddIter(int a, int b)
{
int ret;
while (b)
{
ret = a^b;
b = (a&b)<<1;
a = ret;
}
return ret;
}
//减法(递归法),a - b = a + (-b)
int _BitSub(int a, int b)
{
return _BitAdd(a, -b);
}
//减法(迭代法)
int _BitSubIter(int a, int b)
{
return _BitAddIter(a, -b);
}
//相反数,将各位取反加一,a = -a
int _BitOpp(int a)
{
return _BitAdd(~a, 1);
}
//加一个数的相反数
int _BitAddOpp(int a, int b)
{
return _BitAdd(a, _BitOpp(b));
}
//正数乘法
int _BitMul(int a, int b)
{
int ret = 0;
while (b)
{
if (b&1)
ret = _BitAdd(ret, a);
a = a << 1;
b = b >> 1;
}
return ret;
}
//正数除法
int _BitDiv(int a, int b)
{
int ret = 0;
while (a >= b)
{
a = _BitAddOpp(a, b);
ret = _BitAdd(ret, 1);
}
return ret;
}
//是否负数
int _isBitNeg(int a)
{
return a & 0x80000000;
}
//是否0
int _isBitZero(int a)
{
return !(a & 0xFFFFFFFF);
}
//是否正数
int _isBitPos(int a)
{
return (a&0xFFFFFFFF) && !(a&0x80000000);
}
//有符号乘法
int _BitMulNeg(int a, int b)
{
if (_isBitZero(a) || _isBitZero(b))
return 0;
if (_isBitNeg(a))
{
if (_isBitNeg(b))
return _BitMul(_BitOpp(a), _BitOpp(b));
else
return _BitOpp(_BitMul(_BitOpp(a), b));
}
else
{
if (_isBitNeg(b))
return _BitOpp(_BitMul(a, _BitOpp(b)));
else
return _BitMul(a, b);
}
}
//有符号除法
int _BitDivNeg(int a, int b)
{
if (_isBitZero(b))
{
exit(1);
}
if (_isBitZero(a))
return 0;
if (_isBitNeg(a))
{
if (_isBitNeg(b))
return _BitDiv(_BitOpp(a), _BitOpp(b));
else
return _BitOpp(_BitDiv(_BitOpp(a), b));
}
else
{
if (_isBitNeg(b))
return _BitOpp(_BitDiv(a, _BitOpp(b)));
else
return _BitDiv(a, b);
}
}
main()
{
int a = 5;
int aa = -5;
int b = 3;
int bb = -3;
int c = 15;
printf("%d\n", _BitAdd(a, b));
printf("%d\n", _BitAdd(a, bb));
printf("%d\n", _BitAddOpp(a, b));
printf("%d\n", _BitAddOpp(b, a));
printf("%d\n", _BitMul(a, b));
printf("%d\n", _BitMulNeg(aa, b));
printf("%d\n", _BitDiv(c, a));
printf("%d\n", _BitDivNeg(c, aa));
}
学过数字电路的大概都用与非门画过加法器电路(包括用与非门合成异或电路),用c代码做就太浪费了,还效率低,因为带进位的加法器电路只需要一个脉冲即可得到结果,而c代码需要循环到没有进位才得到结果。楼主代码通过while(b=c)来完成赋值和判断似乎不好理解,下述代码应该好理解些:
unsigned int addbit(unsigned int a,unsigned int b)
{
while(b!=0)
{
a=a^b;
b=((a^b)&b)<<1;
}
return a;
}
位减法就做补码加法,由于c自动对负数做补码,所以楼主并没有完全做位减法,加法用unsigned,减法又用int变量,前后不一致。
据说现在cpu里已经有乘法电路了,一个时钟周期可完成,效率很高了。按我们以往的理解汇编里的乘法指令应该是通过微指令完成的,实现过程就是3楼方法,移位加,也可参考我在“https://bbs.bccn.net/thread-486458-1-1.html”里的回答。