位运算基础

位运算

这是一个很好用也很重要的东西

有哪些运算符呢?

1.按位与 &

2.按位或 |

3.按位异或 ^

4.取反 ~

5.左移 <<

6.右移 >>


1. & 按位与

当相对两位均为一时,结果的相应位数才得一,否则为零
0010 1101(45)

&

1001 1011(-101)

=

00001001
其可以用于对某些位清零,比如要把a的前八位清零,可以用a&255(255的二进制数是0000 0000 1111 1111)

2. | 按位或

相对两位只要有一个为1,结果的相应位数就得一,只有两个数都为零时结果才为零

0001 1111(31)

|

1001 0000(-112)

=

1001 1111(-97)

3. ^ 按位异或

相对两位相同得0,不同得1

0111 1011(123)

^

1100 1101(77)

=

1011 0110(-74)

4. ~ 取反

把1变成0,0变成1

~0111 0010

=

1000 1101

其实就是取反…

5. << 左移

a<<b就相当于把a向左移b位,高位丢掉 哼哼,低位补0

3<<4=0000 0011<<4=0011 0000=48

6. >> 右移

a>>b就相当于把a向右移b位,低位丢掉,高位补0或1**(正数补0,负数补1)**

15>>2=0000 1111>>2=0000 0011=3

-15>>2=1111 0001>>2=1111 1100=-4

tips:其实对于正数来说a>>b=a/2^b

注:按位与,按位或,按位异或的数据均以补码形式呈现

常用的以位运算实现的功能

  • 集合取并(Set union)
    A | B
  • 集合取交(Set intersection)
    A & B
  • 集合相减(Set subtraction)
    A & ~B
  • 集合取反(Set negation)
    ALL_BITS ^ A
  • 置位(Set bit)
    A |= 1 << bit
  • 清位(Clear bit)
    A &= ~(1 << bit)
  • 测位(Test bit)
    (A & 1 << bit) != 0
    (A >> bit & 1) != 0
  • 取最后一个非0位(Extracting every last bit)
    A & -A
    A & ~(A-1)
  • 统计非0位(Counting out the bits)
    For (; A; A -= A & -A) ++cnt;
  • 取所有子集(All the subsets)
    X = A
    While (X) X = (X - 1) & A
  • 判断是否有相邻的1
    (A & A>>1) == 0
  • 交换两整数
    a ^= b, b ^= a, a ^= b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AndrewMe8211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值