位运算的应用

使用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位取反
 
原文地址:https://www.cnblogs.com/acm-bingzi/p/3289704.html