位运算在我们平时开发中很少会用到,以至于它被大多数人所忽略,因此在面试题中能频繁的看到位运算的身影。

由于位运算本质是二进制运算,大多数开发者可能会对此比较陌生,本文旨在揭开位运算的神秘面纱,一同探究其本质,帮助大家掌握位运算的方法。

位运算包括以下几类:

运算符 运算 规则 范例
<< 左移 空位补0,被移除的高位丢弃,空缺位补0。 3 << 2 = 12 --> 3*2*2 = 12
>> 右移

被移位的二进制最高位是0,右移后,空缺位补0;

最高位是1,空缺位补1。

3 >> 1 = 1 --> 3/2 = 1
>>> 无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补。 3 >>> 1 = 1 --> 3/2 = 1
& 与运算 二进制位进行&运算,只有1&1时结果是1,否则是0。 6 & 3=2
|

或运算

二进制位进行|运算,只有0|0时结果是0,否则是1。 6 | 3 = 7
^ 异或运算

相同二进制位进行^运算,结果是0; 1^1 = 0,0^0 = 0

不相同二进制位^运算结果是1。1^0 = 1,0^1 = 1

6^3 = 5
~ 取反运算

正数取反,各二进制码按补码各位取反

负数取反,各二进制码按补码各位取反

~6 = -7

 

注意:运算符的运算过程都是基于二进制的补码运算,需预先了解二进制(原码、补码、反码)相关知识:

①原码:

  原码是指将最高位作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值的数字表示方式。  

/**
例如:数字6 在计算机中原码表示为:00000110
  其中,第一个数字0是符号位,0表示正数,0000110是数字6的二进制数据表示。
  数字 -6 在计算机中原码表示为:10000110
*/

以上是在8位计算机中的原码表示,如果在32位或16位计算机中,表示方法也是一样的,只是多了几个数字0而已。

/**
例如,在32位 计算机中数字6 的原码表示为:00000000 0000 0000 0000 0000 0000 0110
  在16位 计算机中数字6 的原码表示为:00000000 0000 0110
*/

②反码:

  反码表示规则为:如果是正数,则表示方法和原码一样;如果是负数,符号位不变,其余各位取反,则得到这个数字的反码表示形式。

/**
例如,数字6 在8位 计算机中的反码就是它的原码:00000110
  数字-6 在 8位计算机中的反码为:11111001
*/

③补码

  补码是计算机表示数据的一般方式,其规则为:如果是整数,则表示方法和原码一样;如果是负数,则将数字的反码加上1(相当于将原码数值位取反然后在最低位加1)。

/**
例如:数字6 在8位 计算机中的补码就是它的原码:00000110
     数字-6在8位计算机中的补码是:11111010, 原码:10000110, 反码:11111010
*/

注意:0的反码、补码都为零。

下面是具体位运算方法:

1.左移:<<

运算规则:在一定范围内,数据每向左移动一位,相当于原数据*2。(正数、负数都适用)

【注意】当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位,例:3 << 34 = 12,由于3的二进制总位数32(系统是32位),左移34相当于 3 << (34 - 32) --> 3 << 2 = 12。

3 << 4 -->  3*2的4次幂 => 3*16 => 48

二进制运算:

 

-3 << 4  -->  -3*2的4次幂 => -3*16 => -48

二进制运算:

 

2.右移:>>

运算规则:在一定范围内,数据每向右移动一位,相当于原数据/2。(正数、负数都适用)

【注意】如果不能整除,向下取整。例:3.2 >> 1 = 1

69 >> 4  -->  69/2的4次 = 69/16 =4

二进制运算:

69 >> 4  -->  -69/2的4次 = -69/16 = -5

二进制运算:

 

3.无符号右移:>>>

运算规则:往右移动后,左边空出来的位直接补0。(正数、负数都适用)

69 >>> 4  --> 69/2的4次 = 69/16 =4

二进制运算:

 

-69 >>> 4   结果:268435451

二进制运算:

 

4.按位与:&

运算规则:对应位都是1才为1,否则为0。

1 & 1 = 11 & 0 = 0;
0 & 1 = 0;
0 & 0 = 0;
9 & 7 = 1-9 & 7 = 7;

二进制运算:

 

 

5.按位或:|

运算规则:对应位只要有1即为1,否则为0。

1 | 1 = 1;
1 | 0 = 1;
0 | 1 = 1;
0 | 0 = 0;
9 | 7 = 15;
-9 | 7 = -9;

二进制运算:

 

 

6.按位异或:^

运算规则:对应位一个为1一个为0,才为1,否则为0。

1 ^ 1 = 0;
1 ^ 0 = 1;
0 ^ 1 = 1;
0 ^ 0 = 0;
9 ^ 7 = 14;
-9 ^ 7 = -16;

二进制运算:

 

 

7.按位取反:~

运算规则:对应位为1,则结果为0;对应位为0,则结果为1。

~0 = 1;
~1 = 0;
~9 = -10;
~-9 = 8;

二进制计算:

 

 

 总结:位运算的核心是二进制运算,掌握以上7种运算方法,位运算将变得不再困难!

 

脚踏实地行,海阔天空飞~

 

posted on 2023-09-08 12:04  coder__wang  阅读(50)  评论(0编辑  收藏  举报