c/c++位运算(按位与,按位或,按位异或,取反,左右移)

位运算

位运算符含义举例
&按位与a&b
|按位或a|b
^按位异或a^b
~按位取反~a
<<左移a<<1
>>右移b>>2

按位取反 ~

  • 将数据的二进制位取反,0变1,1变0.

按位与 &

  • 两个数的二进制,同时为1才为1,否则为0(否则包括 01 10 00)

  • 主要用途

    1. 将一个单元格清零: x=1010 1000 y=0000 0000 ,x&y=0000 0000
    2. 取出一个数的指定位: x=1010 1110,取后4位,令y=0000 1111, x&y=0000 1110
    3. 判断奇偶:根据末尾为0(偶数)还是1(奇数)决定, if(a & 1) 为奇数是真.

按位或 |

  • 两个数的二进制,同为0才是0,否则为1(否则包括 01 10 11)

    a:0111 1010
    b:1001 1000
    |:1111 1010
    
  • 主要用途

    1. 对于一些数据的某些位设置成1: x=1010 1110,后四位设置成1.令y=0000 1111 ,x|y=1010 1111

按位异或

  • 两个数的二进制,相同为0,不同为1

  • 主要用途

    1. 反转指定位: x=1010 1110,后四位翻转,令y=0000 1111,x^y=1010 0001.
    2. 与0相异或值不变
    3. 交换两个数:a=b;b=a;a^=b;

左移

  • 将一个运算对象的二进制位全部左移若干位,左边的二进制位丢失,右边补0

    a:1010 1110
    a=a<<2;
    a:1011 1000
    //若左移舍弃的高位不包括1,则每左移一位,相当于该数*2
    //m*2^n == m<<n
    

右移

  • 右移就是直接/2,不用担心溢出,产生的小数部分直接丢弃

  • 若是带符号位,符号位空位正数补0,负数补1

  • 牵扯到负数要注意原码反码补码的问题

    //当a为负
    a:0000 1011
    a反码:1111 0100
    a补码:1111 0101
    a=a>>1;
    a补码=1111 1010
    //最高位是1,确定为负数
    a取反+1=0000 0110
    a=-6
    

位运算符可以化简写:

化简原形式
a&=ba=a&b
a|=ba=a|b
a^=ba=a^b
a<<=ba=a<<b
a>>=ba=a>>b

一些基础的位运算操作

描述写法
去掉最后一位x >> 1
在最后加一个0x << 1
在最后加一个1(x<< 1)+1
把最后一位变成1x | 1
把最后一位变成0(x | 1) - 1
最后一位取反x ^ 1
把右数第k位变成1 x xx | (1 << (k-1))
把右数第k位变成0x & (~ (1 << (k-1)))
右数第k位取反x ^ (1 << (k-1))
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值