加减乘除

//加法
int BinaryAdd(int a, int b) {
int carry, add;
do {
add = a ^ b; //该操作得到本位的加法结果
carry = (a & b) << 1; //该操作得到该位对高位的进位值
a = add;
b = carry;
} while (carry != 0); //循环直到某次运算没有进位,运算结束
return add;
}

//减法
int BinarySub(int a, int b) {
return BinaryAdd(a, BinaryAdd(~b, 1));
}

/*乘法
该过程中的bit_map是为了快速得到乘法过程中某位相乘的中间结果S[i]
需要位移的位数。bit_map的键值是2^0, 21,22, ……之类的数,对应的
值是0,1,2,……(即需要位移的位数)。
*/
int BinaryMultiply(int a, int b) {
bool neg = (b < 0);
if(b < 0)
b = -b;
int sum = 0;
map<int, int> bit_map;
for(int i = 0; i < 32; i++) {
bit_map.insert(pair<int, int>(1 << i, i));
}

while(b > 0) {
	/*
	b & ~(b - 1)可以得到乘数b的二进制表示中最右侧1的位置
	last_bit记录被乘数a需要位移的位数
	*/
	int last_bit = bit_map[b & ~(b - 1)];
	//将得到的乘法结果全部相加即为最后结果
	sum += (a << last_bit);
	b &= b - 1; //每次将b的二进制表示的最右侧1去掉用于下一次乘法
}
if(neg)
	sum = -sum;
return sum;

}

//除法
int BinaryDivide(int a, int b){
bool neg = (a > 0) ^ (b > 0);
if(a < 0)
a = -a;
if(b < 0)
b = -b;
if(a < b)
return 0;
int msb = 0;
//msd记录除数需要左移的位数
for(msb = 0; msb < 32; msb++) {
if((b << msb) >= a)
break;
}
int q = 0; //记录每次除法的商
for(int i = msb; i >= 0; i–) {
if((b << i) > a)
continue;
q |= (1 << i);
a -= (b << i);
}
if(neg)
return -q;
return q;
}

int main() {
int a, b;
cin >> a >> b;
cout << "和: " << BinaryAdd(a, b) << endl;
cout << "差: " << BinarySub(a, b) << endl;
cout << "积: " << BinaryMultiply(a, b) << endl;
cout << "商: " << BinaryDivide(a, b) << endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值