# 二进制数和逻辑运算符

> 原文： [https://pythonspot.com/binary-numbers-and-logical-operators/](https://pythonspot.com/binary-numbers-and-logical-operators/)

![binary numbers ](img/74c0efc42f7bf310489f953f2b5cbd0e.jpg)

我们之前已经看过简单的数字和运算。 在本文中，您将学习数字在计算机内部的工作方式以及与此相关的一些魔术 :-)

更详细：虽然这在 Web 应用程序或大多数桌面应用程序中没有直接用处，但了解它非常有用。

在本文中，您将学习如何在 Python 中使用二进制数，如何将其转换为小数以及如何对它们进行按位运算。

## 二进制数

在最低层次上，计算机没有任何数字概念，除了“有信号”或“无信号”。您可以将其视为电灯开关：开关打开或关闭。

这些微小的信息，是您可以在计算机中存储的最小信息，称为位。我们将位表示为低（0）或高（1）。

为了表示大于 1 的数字，使用一系列位的主意诞生了。 一个八位的序列可以存储更大的数字，这称为字节。 由一和零组成的序列称为二进制。我们传统的十位数计数系统称为十进制。

![binary](img/74c0efc42f7bf310489f953f2b5cbd0e.jpg)

二进制数及其十进制表示形式。

让我们在实践中看看：

```py
# Prints out a few binary numbers.
print int('00', 2)
print int('01', 2)
print int('10', 2)
print int('11', 2)

```

第二个参数 2 告诉 Python 我们有一个基于 2 个元素（1 和 0）的数字。 要将字节（8 位）转换为十进制，只需在第一个参数中写入 8 位的组合即可。

```py
# Prints out a few binary numbers.
print int('00000010', 2)   # outputs 2
print int('00000011', 2)   # outputs 3
print int('00010001', 2)   # outputs 17
print int('11111111', 2)   # outputs 255

```

电脑如何做到这一点？ 每个数字（从右到左）乘以 2 的幂。

数字`00010001`是`(1 x 2^0) + (0 x 2^1) + (0 x 2^2) + (0 x 2^3) + (1 x 2^4) + (0 x 2^5) + (0 x 2^6) + (0 x 2^7) = 16 + 1 = 17`。记住，从右到左阅读。

数字`00110010`是`(0 x 2^0) + (1 x 2^1) + (0 x 2^2) + (0 x 2^3) + (**1** x 2^4) + (**1** x 2^5) + (0 x 2^6) + (0 x 2^7) = 32+16+2 = 50`。

自己尝试使用序列`00101010`，以了解您是否了解并使用 Python 程序进行验证。

## 二进制数的逻辑运算

_ 二进制左移和二进制右移 _
在二进制中，乘以因子 2 和除以因子 2 非常容易。 我们只需将位左移或右移。 我们向左下方移动：

| 4 位 | 3 位 | 2 位 | 位 1 |
| --- | --- | --- | --- |
| 0 | 1 个 | 0 | 1 个 |
| 1 个 | 0 | 1 个 | 0 |

在移位（`0,1,0,1`）之前，我们有数字 5。 移位（`1,0,1,0`）后，我们得到数字 10。在 python 中，您可以使用按位向左运算符（`<<`）向左移动，按位向右运算符（`>>`） 向右移动。

```py
inputA = int('0101',2)

print "Before shifting " + str(inputA) + " " + bin(inputA)
print "After shifting in binary: " + bin(inputA << 1)
print "After shifting in decimal: " + str(inputA << 1)

```

输出：

```py
Before shifting 5 0b101
After shifting in binary: 0b1010
After shifting in decimal: 10

```

## AND 运算符

给定两个输入，计算机可以使用这些位进行若干逻辑运算。让我们以 AND 运算符为例。 如果输入 A 和输入 B 为正，则输出将为正。 我们将以图形方式演示 AND 运算符，左边的两个是输入 A 和输入 B，右边的圆是输出：

![Bitwise AND](img/a783141f02a6302a2f1e80908156dc5d.jpg)

按位 AND

在代码中，这就像使用`&`符号一样简单，该符号代表逻辑 AND 运算符。

```py
# This code will execute a bitwise logical AND. Both inputA and inputB are bits.
inputA = 1
inputB = 1

print inputA & inputB   # Bitwise AND

```

通过更改输入，您将获得与上图相同的结果。 我们可以对一个序列执行 AND 运算符：

```py
inputA = int('00100011',2)   # define binary sequence inputA
inputB = int('00101101',2)   # define binary sequence inputB

print bin(inputA & inputB)   # logical AND on inputA and inputB and output in binary

```

输出：

```py
0b100001   # equals 00100001

```

这是有道理的，因为如果您手动进行操作：

```py
00100011
00101101
--------   Logical bitwise AND
00100001

```

## OR 运算符

现在您已经了解了 AND 运算符，让我们看一下 OR 运算符。 给定两个输入，仅当 A 和 B 均为零时，输出才为零。

![binary bitwise OR](img/b726bf5bcea4b7fc5dd8a2908ec4d963.jpg)

二进制按位 OR

要执行它，我们使用`|`运算符。 可以像这样简单地执行一系列位：

```py
inputA = int('00100011',2)  # define binary number
inputB = int('00101101',2)  # define binary number

print bin(inputA)            # prints inputA in binary
print bin(inputB)            # prints inputB in binary
print bin(inputA | inputB)   # Execute bitwise logical OR and print result in binary

```

输出：

```py
0b100011
0b101101
0b101111

```

## XOR 运算符

这是一个有趣的运算符：异或或简称 XOR。

![bitwise XOR](img/461628f4ea72f485b16a902f65db838a.jpg)

按位 XOR

为了执行它，我们使用`^`运算符。 可以像这样简单地执行一系列位：

```py
inputA = int('00100011',2)  # define binary number
inputB = int('00101101',2)  # define binary number

print bin(inputA)            # prints inputA in binary
print bin(inputB)            # prints inputB in binary
print bin(inputA ^ inputB)   # Execute bitwise logical OR and print result in binary

```

输出：

```py
0b100011
0b101101
0b1110

```