深入理解位运算

379 阅读4分钟

1. 二进制在运算中的说明

二进制是逢2进位的进位制,0,1是基本算符。

现代的电子计算机技术底层全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现,计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用0和1两个数字及其组合来标识任何数,进位规则则是“逢二进一”,数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。

在计算机的内部,运行各种运算时,都是以二进制的方式来运行的

2. 原码、反码、补码

(1)二进制的最高位是符号位:0表示正数,1表示负数。 比如:1的二进制是[0000 0001],-1的二进制是[1000 0001]

(2)正数的原码,反码,补码都一样

(3)负数的反码 = 它的原码符号位不变,其他位取反(0 -> 1; 1 -> 0)

比如:-1 -> 原码:[1000 0001] -> 反码:[1111 1110]

(4)负数的补码 = 它的反码 + 1

比如:-1 -> 原码:[1000 0001] -> 反码:[1111 1110] -> 补码:[1111 1111]

(5)0的反码,补码都是0

(6)在计算机运算的时候,都是以补码的方式来运算的。(重要!!)

3. 位运算

位运算符号规则
按位与&两位全为1,结果为1,否则为0
按位或l两位有一个为1,结果为1,否则为0
按位异或两位一个为0,一个为1, 结果为1,否则为0

案例:

(1) 2 & 3 = ?

因为在计算机运算的时候,都是以补码的方式来运算的,所以要先计算出2和3的补码
2是正数,原码,反码和补码一样,所以2的补码是 0000 0010
3也是正数,原码,反码和补码一样,所以3的补码是 0000 0011
那么 2 & 3 的二进制与结果是:0000 0010 & 0000 0011 = 0000 0010
记住:得到的结果也是补码,这里补码的最高位符号位是0,所以是正数,如果符号位是1就要根据补码再去计算原码得到结果
那么结果是 2

(2) 2 | 3 = ?

那么 2 | 3 的二进制与结果是:0000 0010 | 0000 0011 = 0000 0011
那么结果是 3

(3) 2 ^ 3 = ?

那么 2 | 3 的二进制与结果是:0000 0010 ^ 0000 0011 = 0000 0001
那么结果是 1

(3) -2 ^ 2 = ?

因为在计算机运算的时候,都是以补码的方式来运算的,所以要先计算出-2和2的补码
-2是负数,原码:1000 0010 -> 反码:1111 1101 -> 补码:1111 1110
2是正数,原码,反码和补码一样,所以2的补码是 0000 0010
那么 -2 ^ 3 的二进制与结果是:1111 1110 & 0000 0010 = 1111 1100
这里会发现最高位的符号位是1,所以这是一个负数,因为负数的原码、反码和补码不一样,所以要将补码转成原码才能得到数值。
补码:1111 1100 -> 反码 1111 1011 -> 原码 1000 0100
根据二进制原码可以得到结果是 -4

4.移位运算符

移位运算符符号规则
右移运算符>>低位溢出,符号位不变,并用符号位补溢出的高位
左移运算符<<符号位不变,低位补0

案例:

1 >> 1 = ?

1 的补码是 0000 0001,左移后低位溢出,符号位是0,那么结果是:0000 0000,原码补码一样,所以结果是0

-1 >> 1 = ?

-1 的补码是 1111 1111,左移后低位溢出,符号位是1,那么结果是:1111 1111,得到的原码是 1000 0001,所以结果是-1

-5 >> 2 = ?

-5 的补码是 1111 1011,左移后低位溢出,符号位是1,那么结果是:1111 1110,由这个补码得到的原码是 1000 0010,所以结果是-2

-5 << 2 = ?

-5 的补码是 1111 1011,右移符号位不变,低位补0,那么结果是:1110 1100,由这个补码得到的原码是 10010100,所以结果是 -20