位运算

1:背景

从现代计算机中所有的数据二进制的形式存储在设备中。即0、1两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。
我们每一种语言最终都会通过编译器转换成机器语言来执行,所以直接使用底层的语言就不需要便编译器的转换工作从而得到更高的执行效率,当然可读性可能会降低,这也是为什么汇编在大部分情况下有更快的速度。项目中合理的运用位运算能提高我们代码的执行效率。

2.计算机计算原理

加法和乘法
举一个简单的例子来看下CPU是如何进行计算的,比如这行代码
int a = 35;
int b = 47;
int c = a + b;

复制代码计算两个数的和,因为在计算机中都是以二进制来进行运算,所以上面我们所给的int变量会在机器内部先转换为二进制在进行相加
35: 0 0 1 0 0 0 1 1
47: 0 0 1 0 1 1 1 1
————————————————————
82: 0 1 0 1 0 0 1 0

复制代码再来看下乘法,执行如下的代码
int a = 3;
int b = 2;
int c = a * b;

3: 0 0 0 0 0 0 1 1 * 2
————————————————————
6: 0 0 0 0 0 1 1 0


int a = 3;
int b = 4;
int c = a * b;

3: 0 0 0 0 0 0 1 1 * 4
————————————————————
12: 0 0 0 0 1 1 0 0


int a = 3;
int b = 8;
int c = a * b;

3: 0 0 0 0 0 0 1 1 * 8
————————————————————
24: 0 0 0 1 1 0 0 0

复制代码通过以上运算可以看出当用a乘b,且如果b满足2^N的时候 就相当于把a的二进制数据向左移动N位,放到代码中 我们可以这样来写 a << N,所以上面3 * 2、3 * 4、3 * 8其实是可以写成3<<1、3<<2、3<<3,运算结果都是一样的。
那假如相乘的两个数都不满足2N怎么办呢?其实这个时候编译器会将其中一个数拆分成多个满足2N的数相加的情况,打个比方
int a = 15; int a = 15
int b = 13; => int b = (4 + 8 + 1)
int c = a * b; int c = a * b

复制代码最后其实执行相乘运算就会变成这样 15 * 4 + 15 * 8 + 15 * 1,按照上文说的移位来转换为位运算就会变成15 << 2 + 15 << 3 + 15 << 0
减法和除法
减法也是与加法同理只不过计算机内减法操作就是加上一个数的负数形式,且在操作系统中都是以补码的形式进行操作(因为正数的源码补码反码都与本身相同)。首先, 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减. 但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.
除法的话其实和乘法原理相同,不过乘法是左移而除法是右移,但是除法的计算量要比乘法大得多,其大部分的消耗都在拆分数值,和处理小数的步骤上,所以如果我们在进行生成变量的时候如果遇到多位的小数我们尽量把他换成string的形式,这也是为什么浮点运算会消耗大量的时钟周期(操作系统中每进行一个移位或者加法运算的过程所消耗的时间就是一个时钟周期,3.0GHz频率的CPU可以在一秒执行运算3.010241024*1024个时钟周期)

3.位运算符

含义符号列子
左移<<
右移>>
按位与(AND 相应为都为1,结果为1,否则为1)&0101
AND 0011
= 0001
按位或(OR 相应有1,结果为1,否则为0)|
取反(NOT)~
按位异或(XOR 相同为0,不同为1)^0101
XOR 0011
= 0110

参考:
关于位运算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值