Python 负数的位运算

Python 负数的位运算

Python 负数的位运算

1. 引言

Python 中,位运算是一种对二进制数进行操作的方法。通常,位运算对于非负整数来说是比较直观的,但当涉及到负数时,可能会出现一些意外的结果。本文将详细介绍 Python 中负数的位运算,并解释其中的一些特殊情况。

2. 原码、反码和补码

在了解负数的位运算之前,我们首先需要了解一些基本概念:原码、反码和补码。

  • 原码:用最高位表示符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值。

  • 反码:正数的反码和原码相同,负数的反码则是对其原码逐位取反。

  • 补码:正数的补码和原码相同,负数的补码则是在反码的基础上加1。

在计算机中,负数通常以补码的形式存储。对于一个字长为 n 位的计算机,补码的表示范围为 -2^(n-1) 到 2^(n-1)-1,其中最高位是符号位。

3. 位运算符

Python 提供了多种位运算符,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。

3.1 按位与(&

按位与操作符(&)将两个操作数的每一位进行与运算,并返回结果。它的运算规则如下:

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

示例代码:

a = 5    # 二进制表示为 0101
b = 3    # 二进制表示为 0011
result = a & b
print(result)   # 输出 1
Python

3.2 按位或(|

按位或操作符(|)将两个操作数的每一位进行或运算,并返回结果。它的运算规则如下:

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

示例代码:

a = 5    # 二进制表示为 0101
b = 3    # 二进制表示为 0011
result = a | b
print(result)   # 输出 7
Python

3.3 按位异或(^

按位异或操作符(^)将两个操作数的每一位进行异或运算,并返回结果。它的运算规则如下:

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

示例代码:

a = 5    # 二进制表示为 0101
b = 3    # 二进制表示为 0011
result = a ^ b
print(result)   # 输出 6
Python

3.4 按位取反(~

按位取反操作符(~)对操作数进行逐位取反运算,并返回结果。它的运算规则如下:

~0 = 1
~1 = 0

示例代码:

a = 5    # 二进制表示为 0101
result = ~a
print(result)   # 输出 -6
Python

3.5 左移(<<

左移操作符(<<)将一个数的二进制表示向左移动指定的位数,并在右侧补零。移动后超出范围的位数将被舍弃。左移运算的结果等于原数乘以 2 的移动位数次方。

示例代码:

a = 5    # 二进制表示为 0101
result = a << 2
print(result)   # 输出 20
Python

3.6 右移(>>

右移操作符(>>)将一个数的二进制表示向右移动指定的位数,并根据符号位进行扩展。移动后超出范围的位数将被舍弃。右移运算的结果等于原数除以 2 的移动位数次方取整。

示例代码:

a = -10    # 二进制表示为 11111111111111111111111111110110
result = a >> 2
print(result)   # 输出 -3
Python

4. 负数的位运算

从前面的介绍中可以看出,负数在计算机中以补码的形式存储。这导致了在位运算中可能出现一些意外的结果。

4.1 按位与(&)和按位或(|

对于按位与(&)和按位或(|)运算,负数的二进制表示中最高位为符号位,即1。因此,当对负数进行按位与或按位或运算时,最终的结果都将带有符号位的影响。

示例代码:

a = -5    # 二进制表示为 11111111111111111111111111111011
b = 3     # 二进制表示为 00000000000000000000000000000011
result = a & b
print(result)   # 输出 3

result = a | b
print(result)   # 输出 -1
Python

4.2 按位异或(^

对于按位异或(^)运算,负数的二进制表示中最高位为符号位,即1。因此,负数和正数进行按位异或时,最终的结果不再带有符号位的影响。

示例代码:

a = -5    # 二进制表示为 11111111111111111111111111111011
b = 3     # 二进制表示为 00000000000000000000000000000011
result = a ^ b
print(result)   # 输出 -6
Python

4.3 按位取反(~

在按位取反(~)运算中,负数的补码将逐位取反。由于 Python 中整数类型的位数是可变的,因此补码中可能有多余的位数,这些位数也会被取反。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册