1. 程式人生 > >使用位操作實現加減乘除運算

使用位操作實現加減乘除運算

前言

在實際應用中一定要注意邊界問題,包括上邊界和下邊界

注意:

位操作中常用的公式

a=n&(n-1);//去掉n中最右邊的1;
b=n&(-n);//得到n中最右邊的1
-n==~n+1;
-n==~(n-1);

程式碼:
/*在正式應用中一定要注意邊界問題,包括上邊界和下邊界*/
#include<iostream>
#include<map>
using namespace std;
int add(int a, int b)
{
	if (a==0)
	{
		return b;
	}
	int carry = (a&b)<<1;
	int adder = a^b;

	return add(carry, adder);
}

int substract(int a, int b)
{
	return add(a, -b);
}

int mulit(int a, int b)
{
	bool _ = (a > 0)^(b > 0);
	a = abs(a);
	b = abs(b);
	int ans=0;
	map<int, int> bitmap;
	for (size_t i = 0; i < 32; i++)
	{
		bitmap[1 << i] = i;
	}
	while (b>0)
	{

		int carry = bitmap[b&(-b)];
		b = b ^ (b&(-b));
		ans += a << carry;
	}
	return _ ? -ans : ans;
}
int divide(int a, int b)
{
	bool _ = (a > 0)^(b > 0);
	a = abs(a);
	b = abs(b);
	int ans = 0;
	while (a >= b)
	{
		int m = 1;
		int nb = b;
		while ((nb<<1)<a)
		{
			nb <<= 1;
			m <<= 1;
		}
		ans += m;
		a -= nb;
	}
	return _ ? -ans : ans;
}
int main()
{
	int a = -26;
	int b = 3;
	cout << "和:" << add(a, b) << endl;
	cout << "差:" << substract(a, b) << endl;
	cout << "積:" << mulit(a, b) << endl;
	cout << "商:" << divide(a, b) << endl;
}
結果: