使用位运算实现int32位 整数的加减乘除
我觉得比较难想的是加法吧。
首先加法,脑海中脑补二进制加法,相同位相加,超过2 ,则进1,留0
那么用位运算怎么实现呢?其实理解了异或和与操作,就很容易想出来了。
我觉得异或操作和与操作完全就是实现加法的。 异或就是相同位相加最后留下的结果,而与就是相同位相加是否进1的结果。
异或:相同位 相同为0,不同为1。
与:相同位 都是1结果才是1,否则都是0。
这不就是二进制相加吗?
异或 与
1+1 = 0 进1
1+0 = 1 进0
0+0= 0 进0
所以加法就是,每次先异或一下,然后算出来进位的结果,再左移一位,因为是进位嘛
static int Add(int x, int y)
{
while (y != 0)
{
int z = x;
x ^= y;
y &= z;
y <<= 1;
}
return x;
}
减法,就很容易实现了,减一个数等于加上这个数的负数
一个数怎么变成负数呢?取反码然后+1
所以减法就是
static int Sub(int x, int y)
{
int z = Add(~y, 1);
return Add(x, z);
}
那么乘法呢,简单的想法是,一个一个想加呗,a* b不就是b个a相加,对不对,想法的是对的,但是我们要利用二进制的思想,也就倍增的思想。
任何两个数相乘可以看成,举个例子
15 * 19
= 15 * 1 + 15 * 2 + 15 * 16
而15 * 1 就是 15 << 0
15 * 2 就是 15 << 2
所以原本要加19次的,现在变成了加三次,并且每次向左移动一位就可以了。
那么怎么把19 变成 16 + 2 + 1呢?
很简单,for 循环,看代码吧
static int Multiply(int x, int y)
{
int res = 0;
for (int i = 30; i >= 0; i--)
{
if ((1 << i) <= y)
{
res = Add(res, x << i);
y = Sub(y, 1 << i);
}
if (y == 0)
break;
}
return res;
}
除法和乘法类似,我们可以用倍增的思想,任何数字都可以由2x+2y+2^z......组成的。
所以我们用被除数减去 除数*2^x ,那么商就+= 2^x ,然后减去得到差,继续再减 除数的2^x
c++
static int Dev(int x, int y)
{
int res = 0;
for (int i = 30; i >= 0; i--)
{
if (y << i <= 0) continue;
if (y << i <= x)
{
res = Add(res, 1 << i);
x = Sub(x, y << i);
}
if (x == 0)
break;
}
return res;
}
最后再补充位运算一个有趣的网站
http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog
http://www.matrix67.com/blog/archives/3985
使用位运算实现int32位 整数的加减乘除的更多相关文章
- Java位运算总结:位运算用途广泛《转》
前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
- Java位运算总结:位运算用途广泛
前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
- 嵌入式C语言位运算之清位置位
如题,在嵌入式开发中,掌握位运算是节省开发时间和提高开发效率的一种高效方式. 我们不得不去熟悉如何快速掌握位运算这种高效的技巧,接下来看看程序.. #include <stdio.h> # ...
- SQLSERVER---- 通过位运算更改标志位
当给多个中心传输数据时,怎么标记哪些单位推送了,哪些单位没有更新,如果单独设置一个字段,一来说,扩展不足,另外会造成数据库冗余,这里可以采用SQLSERVER的位运算. 比如说,更新标志位为0,长度为 ...
- 牛客小白月赛28 D.位运算之谜 (位运算)
题意:给你两个正整数\(x\)和\(y\),求两个正整数\(a\),\(b\),使得\(a+b=x\),\(a\)&\(b\)=\(y\),如果\(a\),\(b\),输出\(a\ xor \ ...
- 位运算练习:将整数A转换为B,需要改变多少个bit位
思路解析: 将整数A转换为B,如果A和B在第i(0<=i<32)个位上相等,则不需要改变这个BIT位,如果在第i位上不相等,则需要改变这个BIT位.所以问题转化为了A和B有多少个BIT位不 ...
- OptimalSolution(8)--位运算
一.不用额外变量交换两个整数的值 如果给定整数a和b,用以下三行代码即可交换a和b的值.a = a ^ b; b = a ^ b; a = a ^ b; a = a ^ b :假设a异或b的结果记为c ...
- JavaScript 位运算总结&拾遗
最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...
- 位运算总结&拾遗
JavaScript 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识 ...
随机推荐
- day 69作业
""" 1.按照上方 知识点总结 模块,总结今天所学知识点: 2.有以下广告数据(实际数据命名可以略做调整) ad_data = { tv: [ {img: 'img/t ...
- Mysql数据库 深度知识点
停止命令:net stop mysql 启动命令:net start mysql mysql登录命令 mysql -h ip -P 端口 -u 用户名 -p mysql --version 或 ...
- 为DS5添加新的gcc工具链
环境: 步骤: 1.下载mingw32版本的工具链 下面有两个下载工具链的网站: ARM官网的: https://developer.arm.com/tools-and-software/open-s ...
- Spring的感知能力 Aware
在 Spring 框架中有一个 org.springframework.beans.factory.Aware 接口, Aware 是感知感应的意思,那么此接口的作用就是为 Spring 中的 bea ...
- PHP的SOLID设计原则
SOLID Design Principles, 这是一个比设计模式更高级别的概念, 以构建良好代码为目标,真正掌握了就是大师级别了. 我~~~仅知晓~ /*SOLID Design Principl ...
- VMware Xcode真机调试
原因如下:VMware12默认使用usb3.0 ,先给苹果系统关机,然后打开虚拟机设置,更改usb控制器为USB2.0 就可以成功连接了. 问题提示:could not launch “name” p ...
- 11-赵志勇机器学习-DBSCAN聚类
(草稿) 两点关系的三种定义: 1. 直接密度可达:A在B的邻域内: 2. 密度可达:AB之间存在,直接密度可达的点串: 3. 密度连接:AB之间存在点k,使得Ak和Bk都密度可达: 过程: 1. 对 ...
- struts2学习2
拦截器 //拦截器:第一种创建方式 //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁 public class MyInterceptor implements Interceptor { @ ...
- zzulioj - 2597: 角谷猜想2
题目链接: http://acm.zzuli.edu.cn/problem.php?id=2597 题目描述 大家想必都知道角谷猜想,即任何一个自然数,如果是偶数,就除以2,如果是奇数,就乘以3再加1 ...
- Qt常用类——Qpoint
QPoint 类代表一个坐标点,实现在 QtCore 共享库中.它可以认为是一个整型的横坐标和一个整型的纵坐标的组合. 构造 QPoint 类支持以下两种构造方式: QPoint(); // 构造横纵 ...