//加法
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;
}