位运算介绍

从雨巨那里学的位运算,来分享一波

什么是位运算?

位运算:位运算是系统所提供的直接对数字的数位进行操作的运算。具体有以下几种操作:

<< 左移运算符

>> 右移运算符

  |   或

  &  与

  ~  取反

  ^  异或

系统存储数字是按照二进制存储的,即内存中的每个数字都是由0、1构成的字符串;引入十进制中的进制词(即个、十、百位等,注意,这里只是引用,所描述的对象依然是二进制的0、1字符串),位运算就是直接对处于某些进制上的数字进行改变,举几个例子说明一下:

以下括号中字符串均为二进制,不再予以标注

  • (1010)>>1   此操作的意思就是1010右移一位,结果变成了(101);因为第四位的0由于右移被舍去,如果(1010)>>2,结果就是(10),因为最后的10均被舍去。
  • (1010)<<1   此操作的意思就是1010左移一位,结果是(10100);多出来的位数补0,十位上的1移到了百位上。
  • & 、 | 操作与编程语言中的 || 和  && 操作相同,若都为1则&的结果为1,有一者为1则 | 的结果为1,其余情况结果都为0。如1010 & 0010=0010,1010 | 0010=1010。
  •  ~ 操作不同于编程语言中的!,此操作是令二进制字符串中的0、1互换,即0变成1,1变成0;如 ~1010 结果为 0101 。 
  •   ^   异或操作,就是判断两者是不是不一样,不一样的话就是1,一样的话就是0。比如1010 ^ 0011 = 1001。
  • 其中,进行异或运算时,任何数异或0不变,任何数异或1就取反。如1010 ^ 1=1011。
  • 这里要注意的是,&、|、^操作均为两字符串相对应位置的单个字母的操作,例如:1010 | 1=1011,后者只有一位,至于前者的最后一位进行或运算,前者的前三位不受影响。

位运算的小技巧:

介绍一个位运算的小技巧:

a=a^b;
b=a^b;
a=a^b;

问:这三个语句有什么作用?

我们推导一下便知:

位运算介绍_第1张图片

可见,语句的作用是交换a,b的值。 

位运算的基础操作:

基础的位运算操作很重要,这里列举部分:

  1. 去掉最后一位:x>>1
  2. 在最后加一个0:x<<1
  3. 在最后加一个1:x<<1 + 1(+也可用 | )
  4. 把最后一位变成1:x | 1
  5. 把最后一位变成0:(x>>1)<<1  或者 x | 1 - 1
  6. 最后一位取反:x^1
  7. 把右数第k位变成1:x | (1<<(k-1))
  8. 把右数第k位变成0:x & (~(1<<(k-1)))

运算优先级:

在写代码的时候一定要注意运算符的优先级不同可能造成的影响,所以一定要加括号。

位运算介绍_第2张图片

 

你可能感兴趣的:(数据结构)