转自:http://www.cnblogs.com/dandingyy/archive/2012/10/29/2745570.html

^: 按位异或;&:按位与; | :按位或

计算机系统中,数值一律用补码来表示:因为补码可以使符号位和数值位统一处理,同时可以使减法按照加法来处理。

对补码做简单介绍:数值编码分为原码,反码,补码,符号位均为0正1负。

原码 -> 补码: 数值位取反加1

补码 -> 原码: 对该补码的数值位继续 取反加1

补码 的绝对值(称为真值):正数的真值就是本身,负数的真值是各位(包括符号位)取反加1(即变成原码并把符号位取反).

b -> -b : 各位(包括符号位)取反加1

加法运算:将一个整数用二进制表示,其加法运算就是:相异(^)时,本位为1,进位为0;同为1时本位为0,进位为1;同为0时,本位进位均为0.

所以,不计进位的和为sum = a^b,进位就是arr = a&b,(与sum相加时先左移一位,因为这是进位)。完成加法直到进位为0.

减法运算:a-b = a+(-b)  根据补码的特性,各位取反加1即可(注意得到的是相反数,不是该数的补码,因为符号位改变了)

(上面用二进制实现的加减法可以直接应用于负数)

乘法运算:原理上还是通过加法计算。将b个a相加,注意下面实际的代码。

除法运算:除法运算是乘法的逆。看a最多能减去多少个b,

#include<iostream>
#include<cstdlib>
using namespace std;//递归版本的加法实现
int Add(int a, int b)
{return b ? Add(a^b, (a&b)<<1) : a;/*if(b)return plus_rec(a^b, (a&b)<<1);elsereturn a;*/
}//该为迭代版本
int Add_iter(int a, int b)
{int ans;while(b){ans = a^b;b = (a&b)<<1;a = ans;}return ans;
}//求a的相反数:将各位取反加一
int negative(int a)     //get -a
{return Add(~a, 1);
}int Minus(int a, int b)
{return Add(a, negative(b));
}//正数乘法
int Multi(int a, int b)
{int ans = 0;while(b){if(b&1)ans = Add(ans, a);a = a << 1;b = b >> 1;}return ans;
}//正数除法
int Divide(int a, int b)
{int coun = 0;while(a >= b){a = Minus(a, b);coun = Add(coun, 1);}return coun;
}//判断是否是负数,0,正数
int isneg(int a)
{return a & 0x8000;
}
int iszero(int a)
{return !(a & 0xFFFF);
}
int ispos(int a)
{return (a&0xFFFF) && !(a&0x8000);
}//处理负数的乘法和除法
int My_Multi(int a, int b)
{if(iszero(a) || iszero(b))return 0;if(isneg(a)){if(isneg(b))return Multi(negative(a), negative(b));elsereturn negative(Multi(negative(a), b));}else if(isneg(b))return negative(Multi(a, negative(b)));elsereturn Multi(a, b);
}int My_Divide(int a, int b)
{if(iszero(b)){cout << "Error!" << endl;exit(1);}if(iszero(a))return 0;if(isneg(a)){if(isneg(b))return Divide(negative(a), negative(b));elsereturn negative(Divide(negative(a), b));}else if(isneg(b))return negative(Divide(a, negative(b)));elsereturn Divide(a, b);}int main(int argc, char **argv)
{int a = 5;int aa = -5;int b = 3;int bb = -3;int c = 15;cout << Add(a, b) << endl;cout << Add(a, bb) << endl;cout << Minus(a, b) << endl;cout << Minus(b, a) << endl;cout << Multi(a, b) << endl;cout << My_Multi(aa, b) << endl;cout << Divide(c, a) << endl;return 0;
}

用位运算实现四则运算之加减乘除相关推荐

  1. 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3)

    听同学百度二面中,不准用四则运算操作符来实现四则运算.一想就想到了计算机组成原理上学过的.位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算. 加法运算: int AddW ...

  2. 位运算实现四则运算(C++实现)

    前言 Leetcode中有一道这样的题:给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 di ...

  3. 位运算实现简单的加减乘除

    所有的数据在计算机中都以二进制的形式存储,对二进制的运算叫做位运算,即符号位共同参与运算的运算. 基本形式: &  与:仅当两个位都为1时,结果为1: |   或 :两个位有一个位为1时,结果 ...

  4. 算法:位运算加减乘除

    今日做leetCode的371题算法题,用位运算计算两个数之和.借此机会,将位运算的加减乘除做一整理. package Algorithm;public class Code371 {public s ...

  5. 算法笔记(一)位运算、二分、基本递归、排序、基本数据结构

    文章目录 位运算 原码.补码与反码 左移右移`<<` & `>>` 无符号右移 异或运算`^` 位运算常用技巧 取相反数 反转0-1 判断负数与非负数 数组交换两元素位 ...

  6. 位运算的一些有用的操作

    位运算的骚操作(一)之四则运算 ​ 可以这样说,位运算是我们刚开始学计算机就会接触到的一种东西.那么位运算这么常见,我们是否可以使用它来做一些骚操作呢? 使用的运算符包括下面(java还有一个> ...

  7. java实现三位数加减乘除_用Java位运算实现加减乘除四则运算

    感谢博客:http://blog.csdn.net/itismelzp/article/details/49621741  提供的思路. 要用位运算来实现四则运算,不仅仅要知道&,|,~,^, ...

  8. 只用位运算来实现整数的加减乘除四则运算

    首先回忆计算机组成原理学过的内容,数字在机器ALU运算逻辑单元内部是以补码形式进行运算的,因为补码有两个优势: 1.能做到符号位和数值部分一起运算,这样无需单独考虑符号. 2.能把减法运算转化为加法运 ...

  9. 位运算实现加减乘除四则运算(Java)

    本文是继<一文了解有趣的位运算>的第二篇文章. 我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平.无论多么复 ...

最新文章

  1. 希尔排序及C语言实现
  2. json对象和json字符串之间的转化
  3. VTK:非结构化网格之ClipUnstructuredGridWithPlane2
  4. cf1561D Up the Strip(D1D2)
  5. 嵌入式OS入门笔记-以RTX为案例:三.初探进程
  6. c++椭圆最小二乘法原理_c++ 椭圆拟合之最小二乘法(图像处理)
  7. 7. Android Basic UI的布局 WidgetDemo基本组件演示
  8. mysql 5.6.31 配置_MySQL5.6.31 winx64.zip 安装配置教程详解
  9. bzoj 3308: 九月的咖啡店(最大费用最大流)
  10. 26. Remove Duplicates from Sorted Array【easy】
  11. spring3: AOP 之 6.2 AOP的HelloWorld
  12. JDK及Eclipse下载安装教程
  13. 计算机ascii码表
  14. 计算机一级excel试题百度云,excel计算机一级试题
  15. 向量积计算三角形面积
  16. 自己做量化交易软件(20)通达信公式选股程序的实现
  17. eclipse下maven调试的技巧(Re-run Maven using the -X switch to enable full debug logging.)
  18. 大数据入门:Scala大数据黄金语言
  19. 【实习面经】一口气面完了字节、陌陌、云从,我发现面试官原来是这样问问题的?
  20. C语言移位的一些理解>>

热门文章

  1. 10012 - How Big Is It?
  2. Nhibernate分页测试续(附源码)
  3. 「BZOJ 3994」「SDOI 2015」约数个数和「莫比乌斯反演」
  4. 问题 1436: 地宫取宝 (dp)
  5. 有趣但是没有用的linux命令
  6. Linux中文件上传使用rz
  7. Linux命令删除某目录下的所有.svn文件
  8. c#的DateTime.Now函数详解
  9. java ubuntu 14.04,Ubuntu 14.04安装java的方法
  10. linux进程--进程调度算法(十三)