返回

20分钟入门位运算:LeetCode题解带你轻松理解位运算精髓

前端

20分钟入门位运算:LeetCode题解带你轻松理解位运算精髓

导语

位运算作为计算机科学中的一个重要分支,在算法、操作系统、计算机体系结构等领域都有着广泛的应用。对于非科班出身的人来说,位运算可能是一个陌生的概念,但它并不难理解。本文将以LeetCode题解为基础,深入浅出地讲解位运算的基本原理,从二进制开始,介绍按位与、按位或、异或运算、位移运算、进制转换等概念,并通过代码示例生动形象地展示这些运算的应用。此外,还讨论了补码和溢出的概念,帮助读者全面掌握位运算的知识,理解其在计算机科学中的重要作用。

一、二进制简介

计算机内部存储和处理信息都是以二进制的形式进行的。二进制只有0和1两种数字,与十进制不同,二进制的每一位都有其特定的权重,从右到左依次为1、2、4、8、16、32、64等。

二、按位与运算

按位与运算(&)是将两个二进制数的每一位进行与运算,结果为0或1。只有当两个二进制位都为1时,结果才为1,否则为0。

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

按位与运算可以用来判断一个二进制数是否为偶数或奇数。如果一个二进制数的最后一位为0,则该数为偶数;如果一个二进制数的最后一位为1,则该数为奇数。

1011 & 1 = 1
1100 & 1 = 0

三、按位或运算

按位或运算(|)是将两个二进制数的每一位进行或运算,结果为0或1。只有当两个二进制位都为0时,结果才为0,否则为1。

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

按位或运算可以用来判断一个二进制数是否为0。如果一个二进制数的所有位都为0,则该数为0;否则,该数不为0。

0000 | 1 = 1
1111 | 0 = 1

四、异或运算

异或运算(^)是将两个二进制数的每一位进行异或运算,结果为0或1。只有当两个二进制位不同时,结果才为1,否则为0。

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

异或运算可以用来判断两个二进制数是否相等。如果两个二进制数相等,则异或运算的结果为0;否则,异或运算的结果不为0。

1011 ^ 1011 = 0
1100 ^ 1111 = 0111

五、位移运算

位移运算包括左移运算(<<)和右移运算(>>)。左移运算将一个二进制数的每一位向左移动指定位数,空出的位置用0填充;右移运算将一个二进制数的每一位向右移动指定位数,空出的位置用0填充或用符号位填充。

1011 << 1 = 10110
1100 >> 1 = 0110

位移运算可以用来乘以或除以2的幂。左移运算相当于乘以2的幂,右移运算相当于除以2的幂。

1011 << 2 = 101100 = 1011 * 2^2 = 44
1100 >> 1 = 0110 = 1100 / 2^1 = 22

六、进制转换

进制转换是指将一个数从一种进制转换为另一种进制。常用的进制有二进制、十进制、八进制和十六进制。

二进制转十进制:1100 = 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0 = 12
十进制转二进制:12 = 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0 = 1100

进制转换可以通过查表法、移位法、除法法等方法进行。

七、补码和溢出

补码是计算机中表示负数的一种方法。补码的计算方法是:先求出二进制原码,然后将原码的所有位取反,最后将结果加1。

原码:1011
补码:0100

溢出是指在进行算术运算时,结果超出了计算机所能表示的最大值或最小值。溢出可能会导致计算结果不正确。

结语

位运算在计算机科学中有着广泛的应用,是程序设计中的重要基础知识。本文从二进制开始,介绍了按位与、按位或、异或运算、位移运算、进制转换、补码和溢出等概念,并通过代码示例生动形象地展示了这些运算的应用。希望本文能够帮助读者全面掌握位运算的知识,理解其在计算机科学中的重要作用。