C++位运算

常见的位运算:

涉及到位运算的时候,都是将对应的原本的数转换为二进制的数后再操作运算的。

1.与运算(&):

求解的两个数对应位都是1的时候结果位1否则位0;想要知道二进制数中的某一位是否位1的时候,则只需要将其中的二进制数与对应的位数的十进制数相与即可, 如:1223 & 1000 这样得到的结果中只有第一个的值影响。最常用的是取二进制下的最末位,即a&1。这样的技巧可以用于判断奇偶,根据二进制常识,尾数为1则为奇数,反之为偶数。则是当对应的数是偶数的时候则:a & 1得到的结果为:0 否则得到的为:1.

2.或(|)运算:

​ 两个二进制数进行或|运算,如果对应位有一个为1,结果就为1.只有在两个数的对应位置都是0的时候,结果才为0.或运算常用于二进制特定位的赋值。想把哪个位强行变成1,就用这个数|上这个位数对应的二进制数。我们想让00000的第三位变成1.即十进制变4,我们直接|上4就可以。当然,不同于&运算,我们很少用|运算进行任意位赋值。通常来讲,我们只使用a|1把a的最后一位强行变成1,其实质意义是把原数加一。或者使用a|1-1再把它变为0.这个技巧通常用于把它变成它最接近的偶数

3.异或运算:^ 可以用来交换两个数非常有用,a ^= b ^= a ^= b;

​ 两个二进制数进行异或(^)运算,如果对应位相同,不管是0或者是1,都返回1,反之返回0. 一个数经过两次异或之后等于原数。

4.非运算符:~

把给定的二进制数全部取反,是否没有什么用途!

5.左移运算(<<): left = left << 2;

​ a<<b表示把a的二进制位向左移动b位,低位用0补上。根据二进制的常识,我们会发现,二进制第k位上的数就等于2k2k。(从0开始计位)比如,二进制下的100就是2k=2=42k=2=4。所以我们发现,左移运算a<<b的实质就是a×2ba×2b。左移运算最常用的技巧就是用来代替×2的整数次幂的乘法运算。因为我们普遍认为,位运算是要比四则运算加减乘除及模运算更快一些的运算。

6、右移(>>)运算: 除数的时候是向下取整的。

a>>b就是把a的二进制位向右移动b位,溢出的舍去。类比于左移运算,我们发现右移运算就是把a除以2的整数次幂。这就是右移运算的用途——优化除法运算。这里需要特殊说明的是,右移算法可以用在数学知识中的求最大公约数的程序块上。因为mod运算的效率慢的出奇,所以我们可以用右移运算来进行除以2的操作。

位运输的优先级:按位反(~)>位移运算(<<,>>)>按位与(&)>按位异或(^)>按位或(|)

下面是一些常见的操作总结:

1.获取第i位的数字:(a >> i)& 1 或者 a & (1<<i) 其中的i应该是多少位的意思。

2、设置第i位为1:a=a | (1<<i) 记住的是1<<i也就是说为1左移i位后的数字。

3、设置第i位为0:a=a & (~(1<<i))

4、把第i位取反:a=a ^ (1<<i)

5、取出一个数的最后一个1:a&(-a)

6.异或可以用以交换两个数:a=b=a^=b

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值