使用Pascal的OIers简要介绍一下C/C++样式的位运算(bitwise operation)。其优先级:not>and>xor>or
名称
|
C/C++样式
|
Pascal样式
|
简记法则
|
按位与
|
&
|
and
|
全一则一,否则为零
|
按位或
|
|
|
or
|
有一则一,否则为零
|
按位取反
|
~
|
not
|
是零则一,是一则零
|
按位异或
|
^
|
xor
|
不同则一,相同则零
|
左移位
|
<<
|
shl
|
a<<k等价于a*2k
|
右移位
|
>>
|
shr
|
a>>k等价于a/2k
|
•位运算的特殊应用
and:
用以取出一个数的某些二进制位
取出一个数二进制中的最后一个1(lowbit):x&-x
or:将一个数的某些位设为1
not:间接构造一些数:~0u=4294967295=232-1
xor:
不使用中间变量交换两个数:
a=a^b; b=b^a; a=a^b;
将一个数的某些位取反
•获取一个或多个固定位的值
假设x=1010(10进制的10)
我们要获取从左边数第2位的值,那么我们可以这样来取
x&(1<<1)也就是
x: 1010
1<<1: 0010
x&(1<<1) 0010
这样我们就可以通过判断x&(1<<2)是否等于0来知道这一位是0还是1了
当然我们可以用x&(3<<2)来取得第3位和第4位
•把一个或多个固定位的值置零
假设x=1010(10进制的10)
我们要把从左边数第2位的值置零,那么我们可以这样来做
x&(~(1<<1))也就是
x: 1010
~(1<<1): 1101
x&(~(1<<1)) 1000
当然我们可以用x&(~(3<<2))来把第3位和第4位置零
•把一个或多个固定位的值取反
假设x=1010(10进制的10)
我们要把从左边数第2位的值取反,那么我们可以这样来做
x^(~(1<<1))也就是 如果x=1000
x: 1010 1000
1<<1: 0010 0010
x^(1<<1) : 1000 1010
当然我们可以用x^(3<<2)来把第3位和第4位取反