用位运算实现两个整数的加减乘除运算
来源:互联网 发布:淘宝话费怎样退款 编辑:程序博客网 时间:2024/05/21 07:56
位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。
我的思路主要是利用a+1的位运算就是最左端(从第0位开始向左)连续的1变为0,原先a中为0的位置最低那一位变为1。
在不同的位上加1,那就是从相应的位开始向左计算,右边不变。
下面还有一个网上的思路,我觉得这个更好:
我简化一下:
上面的思路就是先不计进位相加,然后再与进位相加,随着递归,进位会变为0,递归结束。
1.整数的加法
- int MyAdd(int a,int b)
- {
- for(int i=1;i;i<<=1)
- if(b&i)
- for(int j=i;j;j<<= 1)
- if(a&j) a&=~j;
- else {a|=j;break;}
- return a ;
- }
我的思路主要是利用a+1的位运算就是最左端(从第0位开始向左)连续的1变为0,原先a中为0的位置最低那一位变为1。
在不同的位上加1,那就是从相应的位开始向左计算,右边不变。
下面还有一个网上的思路,我觉得这个更好:
- int AddWithoutArithmetic(int num1,int num2)
- {
- if(num2==0) return num1;//没有进位的时候完成运算
- int sum,carry;
- sum=num1^num2;//完成第一步没有进位的加法运算
- carry=(num1&num2)<<1;//完成第二步进位并且左移运算
- return AddWithoutArithmetic(sum,carry);//进行递归,相加
- }
我简化一下:
- int Add(int a,int b) { b?return Add(a^b,(a&b)<<1):return a; }
上面的思路就是先不计进位相加,然后再与进位相加,随着递归,进位会变为0,递归结束。
2.整数的减法
这个和加法一样了,首先取减数的补码,然后相加。
- int MyMinus(int a,int b)
- {
- for(int i=1;i&&((b&i)==0);i<<=1);
- for(i<<=1;i;i<<=1) b^=i;
- return MyAdd(a,b);
- }
3.整数的乘法
乘法就是将乘数写成(2^0)*k0 + (2^1)*k1 + (2 ^2)*k2 + ... + (2^31)*k31,其中ki为0或1,然后利用位运算和加法就可以了。
- int MyMul(int a,int b)
- {
- int ans=0;
- for(int i=1;i;i<<=1,a<<=1)
- if(b&i)
- ans+=a;
- return ans;
- }
4.整数除法(正整数)
除法就是由乘法的过程逆推,依次减掉(如果x够减的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。
- int MyDiv(int x,int y)
- {
- int ans=0;
- for(int i=31;i>=0;i--)
- {
- //比较x是否大于y的(1<<i)次方,避免将x与(y<<i)比较,因为不确定y的(1<<i)次方是否溢出
- if((x>>i)>=y)
- {
- ans+=(1<<i);
- x-=(y<<i);
- }
- }
- return ans;
- }
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除
- 用位运算实现两个整数的加减乘除
- 用位运算实现两个整数的加减乘除
- 用位运算实现整数的加减乘除运算
- 位运算实现整数的加减乘除
- 位运算实现整数加减乘除
- 位运算---只使用位运算实现整数的加减乘除
- 只用位运算实现整数的加减乘除运算
- 只用位运算实现整数的加减乘除运算
- JS操作JSON
- 大端(Big Endian)与小端(Little Endian)详解
- 进制转化
- 虚函数、纯虚函数、虚基类、抽象类、虚函数继承、虚继承
- 系统字体及动画详解
- 用位运算实现两个整数的加减乘除运算
- Android配置文件,所有权限
- Ubuntu 10.4 Server 命令行 连接 无限网络
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- Oracle提供的数据字典
- C语言深度解析之二
- CSS3常用效果使用举例
- 预定义,条件编译,数组
- Ubuntu 安装图形界面