/* 加法运算 将一个整数用二进制表示,其加法运算就是: 相异(^)时,本位为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”里的回答。