位运算
这是一个很好用也很重要的东西
有哪些运算符呢?
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