常用位运算简介

注:在写题解的时候想查一下位运算的用法,突然发现自己没有位运算的pdf文件,于是就把上次讲课的PPT的内容重新整理了一下(本篇内容结合了网上诸多大佬对于位运算的介绍,在这里对各位大佬表示感谢)

位运算

C++的几种常见位运算

一、按位与(a & b):

法则:两者的相同位都为 1,则结果中该位为 1;否则结果中该位为 0

0&0=0,0&1=0,1&0=0,1&1=1

例:12 & 6 = 4

12:1 1 0 0

6:0 1 1 0

——————

4:0 1 0 0

与运算的用途:

(1)清零
如果想将一个单元清零,即使其全部二进制位为
0
*,只要与一个各位都为零的数值相与,结果为零。
(2)取一个数的指定位
比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=00001111,然后将XY进行按位与运算(X&Y=0000 1110)即可得到X的指定位。
(3)判断奇偶
只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。

二、按位或(a | b):

法则:两者相同位中有一个为 1,则结果中该位为 1;否则结果中该位为 0

0|0=0,0|1=1,1|0=1,1|1=1

例:12 | 6 = 14

12:1 1 0 0

6:0 1 1 0

——————

14:1 1 1 0

或运算的用途:

(1)常用来对一个数据的某些位设置为1
比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=00001111,然后将X与Y进行按位或运算(X|Y=1010 1111)即可得到。

三、按位异或( a^ b):

法则:两者相同位的值若不同,则结果中该位为 1;否则结果中该位为 0

0 ^ 0=0,0 ^ 1=1,1^ 0=1,1^1=0

例:12 ^ 6 = 10

12:1 1 0 0

6:0 1 1 0

——————

10:1 0 1 0

异或的几条性质:

1、交换律
2、结合律 (a^ b)^c == a^ (b^c)
3、对于任何数x,都有 x^ x=0,x^0=x
4、自反性: a^ b^ b=a^0=a;

异或运算的用途:

1)翻转指定位
比如将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=00001111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。
2)与0相异或值不变
例如:1010 1110 ^ 0000 0000 = 1010 1110
3)交换两个数
举例void Swap(int &a, int &b){
if (a != b){
a ^= b;
b ^= a;
a ^= b;}}

四、按位取反(~a):

法则:该数中 0的位置变为 1;1 的位置变为 0

取反运算的用途:

1)使一个数的最低位为零
使a的最低位为0,可以表示为:a & ~ 1。~1的值为 1111 1111 1111 1110,再按”与”运算,最低位一定为0。因为” ~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

五、按位左移(a<< b):

法则:将该数 a左移 b 位,正数左移后为正数,负数左移后为负数

例:3 << 2 = 12

3:0 0 1 1

12:1 1 0 0

a << b = a × 2b

六、按位右移(a>> b):

法则:将该数 a 右移 b位,正数右移后为正数,负数右移后为负数。不论正负,都下取整

例:13 >> 2 = 3

13:1 1 0 1

3:0 0 1 1

a >> b = a / 2b

七、非 !a:

法则:该数是 0则为 1 ;否则为 0

例:!0 = 1

​ !1 = 0

​ !2 = 0

八、各种运算符优先级

-,!,~> *,/,% > >>,<< > >,<,>=,<= > ==,!= > & > ^ > | > && > || > 问号表达式 > 赋值语句

九、负数表示(-x = ~x + 1

十、位运算常用技巧

将 x 第 i 位取反:x ^= 1 << i

将 x 第 i 位制成 1:x |= 1 << i

将 x 第 i 位制成 0:x &= -1 ^ 1 << i 或 x &= ~(1 << i)

取 x 对 2 取模的结果:x & 1

取 x 的第 i 位是否为 1:x & 1 << i 或 x >> i & 1

取 x 的最后一位:x & -x

取 x 的绝对值:(x ^ x >> 31) - (x >> 31) (int 型)

判断 x 是否不为 2的整次方幂:x & x – 1

判断 a 是否不等于 b:a != b , a – b , a ^ b

判断 x 是否不等于 −1:x != -1 , x ^ -1 , x + 1 , ~x

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值