Update 02. 位运算.md

This commit is contained in:
LSGOMYP
2020-07-16 15:24:00 +08:00
parent e2c976521a
commit f4fc87057b

View File

@@ -4,41 +4,41 @@
二进制有三种不同的表示形式:原码、反码和补码,<u>计算机内部使用补码来表示</u>。
原码:就是其二进制表示(注意,有一位符号位)。
**原码**:就是其二进制表示(注意,有一位符号位)。
```c
```python
00 00 00 11 -> 3
10 00 00 11 -> -3
```
反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。
**反码**:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。
```c
```python
00 00 00 11 -> 3
11 11 11 00 -> -3
```
补码:正数的补码就是原码,负数的补码是反码+1。
**补码**:正数的补码就是原码,负数的补码是反码+1。
```c
```python
00 00 00 11 -> 3
11 11 11 01 -> -3
```
符号位最高位为符号位0表示正数1表示负数。在位运算中符号位也参与运算。
**符号位**最高位为符号位0表示正数1表示负数。在位运算中符号位也参与运算。
## 2. 按位非操作 ~
```c
```python
~ 1 = 0
~ 0 = 1
```
`~``num`的补码中的 0 和 1 全部取反0 变为 11 变为 0有符号整数的符号位在 `~` 运算中同样会取反。
```c
```python
00 00 01 01 -> 5
~
---
@@ -53,7 +53,7 @@
## 3. 按位与操作 &
```c
```python
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
@@ -61,7 +61,7 @@
```
只有两个对应位都为 1 时才为 1
```c
```python
00 00 01 01 -> 5
&
00 00 01 10 -> 6
@@ -71,7 +71,7 @@
## 4. 按位或操作 |
```c
```python
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
@@ -79,7 +79,7 @@
```
只要两个对应位中有一个 1 时就为 1
```c
```python
00 00 01 01 -> 5
|
00 00 01 10 -> 6
@@ -89,7 +89,7 @@
## 5. 按位异或操作 ^
```c
```python
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
@@ -98,7 +98,7 @@
只有两个对应位不同时才为 1
```c
```python
00 00 01 01 -> 5
^
00 00 01 10 -> 6
@@ -107,7 +107,7 @@
```
异或操作的性质:满足交换律和结合律
```c
```python
A: 00 00 11 00
B: 00 00 01 11
@@ -124,7 +124,8 @@ A^B^A: = A^A^B = B = 00 00 01 11
## 6. 按位左移操作 <<
`num << i``num`的二进制表示向左移动`i`位所得的值。
```c
```python
00 00 10 11 -> 11
11 << 3
---
@@ -134,7 +135,7 @@ A^B^A: = A^A^B = B = 00 00 01 11
## 7. 按位右移操作 >>
`num >> i``num`的二进制表示向右移动`i`位所得的值。
```c
```python
00 00 10 11 -> 11
11 >> 2
---
@@ -197,10 +198,10 @@ a 并 b -> a | b
a b -> a & (~b)
```
---
整数在内存中是以补码的形式存在的,输出自然也是按照补码输出。
【例子】C#语言输出负数
注意:整数在内存中是以补码的形式存在的,输出自然也是按照补码输出。
【例子】C#语言输出负数
```c
class Program
@@ -218,7 +219,7 @@ class Program
}
```
但我们看一下 Python 的`bin()` 输出。
【例子】 Python 的`bin()` 输出。
```python
print(bin(3)) # 0b11