浅谈位运算

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

什么是位运算?位运算有什么特性?为什么我要来说说位运算?

目录

 

一、位运算的概况

二、 位运算的高级操作

​编辑

三、位运算的实际运用

位运算交换两整数

位运算判断奇偶数

位运算改变正负性和求绝对值


 

一、位运算的概况

         位运算是在二进制下直接进行的计算,由于计算机中的数在内存中是以二进制存储的,所以位运算会比其他运算更加高效,程序中多使用位运算可以提高程序的性能。

我一直以为位运算很easy,但事实是这家伙不简单呐,下面为你展示它的神奇。 

二、 位运算的高级操作

可好好理解一下,这些操作方法虽然很牛,但是在实际运用当中有什么作用呢?

三、位运算的实际运用

位运算实现乘除法

将x 左移一位实现× 2 ,将x 右移一位实现÷ 2 

a < < 1 ≡ a ∗ 2  

a > > 1 ≡ a / 2  

位运算交换两整数

void swap(int &a,int &b){

      a ^= b;

      b ^= a;

      a ^= b;

}

 这效率非常高,我们来剖析其原理,对于a = a ∧ b ,则b = b ∧ ( a ∧ b ),根据交换律以及异或性质,得b = b ∧ b ∧ a = 0 ∧ a = a  ,同理a = ( a ∧ b ) ∧ a = 0 ∧ b = b  。这样就实现了交换操作。

位运算判断奇偶数

我们知道,在二进制中,最低位决定了是奇数还是偶数,所以我们可以提取出最低位的值,即与1相与即可实现目的,为0则是偶数,为1则是奇数。

位运算改变正负性和求绝对值

int change(int a){

    return ~ a + 1;

}

 对于正数而言,补码就是原码,所以按位取反再+ 1 则得到对应真值负数的补码,而对于负数,其补码进行按位取反再+ 1 则得到对应真值正数的补码,变为原码。那么知道这个我们就可以特判是否为负数==(这里通过右移31 位,若为正数,则得到的是0,若为负数,则得到的是− 1 ,而0 的补码为0000  ,− 1 的补码为1111 ,根据异或性质即可判断。)== 再进行反转即可实现求绝对值了。如下:

int abs(int a){

    return a ^ (a >> 31) ? a : ~ a + 1;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值