Update 02. 位运算.md
This commit is contained in:
@@ -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 变为 1,1 变为 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
|
||||
|
||||
Reference in New Issue
Block a user