【C++】位运算实现加减乘除
#include<iostream>
#include<assert.h>
using namespace std; // 位运算实现加减乘除 int myAdd(int num1, int num2)
{
if (num2 == ) return num1;
int sum = , carry = ;
sum = num1 ^ num2; // 按位抑或
carry = (num1 & num2) << ;
return myAdd(sum, carry);
} int myAddIter(int num1, int num2)
{
int ret = ;
while (num2)
{
ret = num1 ^ num2;
num2 = (num1 & num2) << ;
num1 = ret;
}
return ret;
} int myNeg(int num1)
{
// 正数到负数的补码表示: 取反加1
return myAdd(~num1, );
} int myMinus(int num1, int num2)
{
return myAdd(num1, myNeg(num2));
} // (2^0)*k0 + (2^1)*k1 + (2 ^2)*k2 + ... + (2^31)*k31
int myPosMulti(int num1, int num2)
{
int ret = ;
while (num2)
{
if (num2 & ) // 对应当前num2的最低位是1
ret = myAdd(ret, num1);
num1 <<= ; // num1 = num1 * 2
num2 >>= ; // num2的当前位用过了就右移
}
return ret;
} int myMultiply(int num1, int num2)
{
if (num1 >= && num2 >= )
return myPosMulti(num1, num2);
if (num1 < && num2 >= )
return myNeg(myPosMulti(myNeg(num1), num2));
if (num1 >= && num2 < )
return myNeg(myPosMulti(num1, myNeg(num2)));
if (num1 < && num2 < )
return myPosMulti(myNeg(num1), myNeg(num2));
} // 除法就是由乘法的过程逆推,依次减掉(如果x够减的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。
int myPosDiv(int num1, int num2)
{
num1 = num1 > ? num1 : myNeg(num1);
num2 = num2 > ? num2 : myNeg(num2);
if (num1 < num2)
return ;
long long op = num2;
int ret = ;
int flag;
int curBit = ;
assert(num2 != );
while (op <= num1)
{
op <<= ;
++curBit;
}
op >>= ;
--curBit; while (op >= num2)
{
if (num1 >= op)
{
num1 -= op;
ret += << curBit;
}
op >>= ;
--curBit;
}
return ret;
} int myPosDivByMinus(int num1, int num2)
{
int ret = ;
while (num1 >= num2)
{
num1 = myMinus(num1, num2);
ret = myAdd(ret, );
}
return ret;
} int myPosComp(int num1, int num2)
{
bool isZero(int);
int temp = ;
num2 = num1 ^ num2;
if (isZero(num2)) return ;
while (num2 >>= )
temp <<= ;
return temp & num1;
} int myDivide(int num1, int num2)
{
if ((num1 > && num2 > ) || (num1 < && num2 < ))
return myPosDiv(num1, num2);
else
return myNeg(myPosDiv(num1,num2));
} bool isNeg(int num)
{
return num & 0x8000;
} bool isZero(int num)
{
return !(num & 0xFFFF);
} bool isPos(int num)
{
return !(num & 0x8000) && (num & 0xFFFF);
} //int myMod(int a, int b)
//{
//
//} int divide(int dividend, int divisor) {
int ret = ;
long long curDividend, curDivisor, op;
bool flag;
int curBit = ; // 记录商的1在哪一位
if (divisor == ) return INT_MAX; // 往负数方向溢出咋整
if ((dividend < && divisor > ) || (dividend > && divisor < ))
flag = ; // 负数
else
flag = ; curDividend = abs(dividend);
curDivisor = abs(divisor); if (curDividend < curDivisor) return ; op = curDivisor;
while (op <= curDividend)
{
++curBit;
op = op << ;
}
op = op >> ;
--curBit; while (op >= curDivisor)
{
if (curDividend >= op)
{
curDividend -= op;
ret += << curBit;
}
op = op >> ;
--curBit;
} if (flag)
return ret;
return -ret;
} int main()
{
//INT_MIN -2147483648 INT_MIN 2147483647
int a = INT_MAX; //
int b = -;
cout << "myAdd: " << myAdd(a, b) << endl;
cout << "myMinus: " << myMinus(a, b) << endl;
cout << "myMultiply: " << myMultiply(a, b) << endl;
cout << "myDivide: " << myDivide(a, b) << endl;
// -1010369383, -2147483648
cout << "Leetcode: " << divide(-, INT_MIN) << endl;
//cout << "myMod: " << myMod(a, b) << endl;
system("pause");
return ;
}
【C++】位运算实现加减乘除的更多相关文章
- Java位运算实现加减乘除
一.加法 a+b 举例实现:13+9=22 13+9不考虑进位结果为12 只考虑进位结果为10 和刚好是22. 13二进制为1101,9二进制为1001. 不考虑进位结果为0100.算式为a^b 只考 ...
- 用Java位运算实现加减乘除四则运算
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6412875.html 感谢博客:http://blog.csdn.net/itismelzp/article/ ...
- Java位运算实现加减乘除四则运算
本文是继<一文了解有趣的位运算>的第二篇文章. 我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平.无论多么复 ...
- 位运算实现加减乘除四则运算(Java)
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 本文是继< ...
- 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3) via Hackbuteer1
转自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位异或:&:按位与: | :按位或 计算机系统中,数值一律用补码 ...
- php实现不用加减乘除号做加法(1、善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍)
php实现不用加减乘除号做加法(1.善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍) 一.总结 1.善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍 二.ph ...
- 剑指offer-面试题65-不用加减乘除做加法-位运算
/* 题目: 在不使用加减乘除的前提下,计算两个整数之和. 思路: 不能使用加减乘除则只能考虑位运算. x=num1^num2,则为抹掉进位的结果. y=num1&num2,为只有进位的结果. ...
- 使用位运算实现int32位 整数的加减乘除
我觉得比较难想的是加法吧. 首先加法,脑海中脑补二进制加法,相同位相加,超过2 ,则进1,留0 那么用位运算怎么实现呢?其实理解了异或和与操作,就很容易想出来了. 我觉得异或操作和与操作完全就是实现加 ...
- Java位运算总结:位运算用途广泛《转》
前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
随机推荐
- hibernate多表关联CascadeType类型的选择
CascadeType.REMOVE//慎用 Cascade remove operation,级联删除操作.删除当前实体时,与它有映射关系的实体也会跟着被删除. CascadeType.MERGE ...
- 挑逗 Java 程序员的那些 Scala 绝技
有个问题一直困扰着 Scala 社区,为什么一些 Java 开发者将 Scala 捧到了天上,认为它是来自上帝之吻的完美语言:而另外一些 Java 开发者却对它望而却步,认为它过于复杂而难以理解.同样 ...
- 【JOB】Oracle中JOB的创建方法以及一个细节的探究
在Oracle中可以使用JOB来实现一些任务的自动化执行,类似于UNIX操作系统crontab命令的功能.简单演示一下,供参考. 1.创建表T,包含一个X字段,定义为日期类型,方便后面的定时任务测试. ...
- 微信网页授权demo2
1.在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名.请注意,这里填写的是 ...
- LUOGU P1937 [USACO10MAR]仓配置Barn Allocation
传送门 解题思路 扫了一眼觉得是贪心+线段树,结果贪心的时候刚开始按区间长度排的序..这还有82分,后来叉了自己,换成按右端点排序过了. 代码 #include<iostream> #in ...
- web前端学习(四)JavaScript学习笔记部分(8)-- JavaScript 浏览器对象
1.window对象 1.1.window对象: window对象是BOM的核心,window对象指当前的浏览器窗口 所有javaScript全局对象.函数以及变量均自动生成为window对象的成员 ...
- nginx日志修改时间格式为年月日时分秒
先解除这段注释,使用自定义日志格式 $time_iso8601 生成格式:--20T09::+: $time_local 生成格式: /Apr/::: + 还是选择年月日时分秒看起来舒服一点
- 基于python爬虫的github-exploitdb漏洞库监控与下载
基于python爬虫的github-exploitdb漏洞库监控与下载 offensive.py(爬取项目历史更新内容) #!/usr/bin/env python # -*- coding:utf- ...
- Android平台本地(离线)打包指南 - Android Studio
预备环境 AndroidStudio开发环境,要求安装Android4.0或以上(API 14)SDK. 下载HBuilder离线打包Android版SDK(5+ SDK下载). 离线打包SDK目录说 ...
- 超线程(Hyper-Threading)
运行方式 每个单位时间内,一个CPU只能处理一个线程(操作系统:thread),以这样的单位进行,如果想要在一单位时间内处理超过一个线程是不可能的,除非是有两个CPU的实体单元.双核心技术是将两个一样 ...