Skip to content

Commit 7377665

Browse files
author
liuxinwei
committed
修改: .github/workflows/pages.yml
1 parent 6cf0049 commit 7377665

File tree

6 files changed

+252
-108
lines changed

6 files changed

+252
-108
lines changed

.github/workflows/pages.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ jobs:
3737
- name: 🐍 Set up Python
3838
uses: actions/setup-python@main
3939
with:
40-
python-version: "3.13"
40+
python-version: "3.12"
4141
cache: "pip"
4242
cache-dependency-path: "pyproject.toml"
4343
- name: 🔧 Build HTML

doc/prepare/00_digital.md

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
# 数字与信息
1+
# 数字系统与信息表示
22

3-
从古到今,我们总是被“数”(number)包围着,特别是计数系统为我们带来了极大的便利。我们可以使用如下形式表示任意进制的 $n$ 位非负整数
3+
从古至今,人类始终被“数”(number)包围,计数系统为文明发展提供了重要支撑。任意进制的 $n$ 位非负整数可表示为
44

55
$$
6-
p = \sum_{i=0}^n a_n t_n
6+
p = \sum_{i=0}^{n-1} a_i t^i
77
$$
88

9-
其中,$a_n$ 称为系数,$t_n$ 称为位权。比如说,十进制的数字 $457$ 可以表示为 $4 * 10^2 + 5 * 10^1 + 7 * 10^0$。
9+
其中,$a_i$ 为系数,$t$ 为进制基数(位权的底数)。例如十进制数 $457$ 可表示为 $4 \times 10^2 + 5 \times 10^1 + 7 \times 10^0$。
1010

11-
由于信息论创始人香农指出:通信的最基本消息符号是二值符号。故而现代计算机采用的是二进制数字系统。信息的最小度量单位是 **比特**(bit),以 `0` 或者 `1` 表示两种状态。任何复杂的信息都可以按照一定的编码规则,最终变换为一组 `0` `1` 构成的二进制数据,并能无损地保留信息含义
11+
信息论创始人香农指出:通信的最基本消息单元是二值符号。现代计算机基于二进制数字系统,信息的最小度量单位是 **比特**(bit),以 `0` `1` 表示两种状态。任何复杂信息均可通过编码规则转换为 `0` `1` 构成的二进制数据,并完整保留信息含义
1212

13-
计算机以 **字节** (byte)组织各种信息,字节是计算机用于存储、传输、计算的基本计量单位
13+
计算机以 **字节**(byte)为基本单位存储和处理各类信息,是存储、传输、计算的核心计量单位
1414

1515
```{note}
1616
一个字节可以存储 8 位(bit)二进制数,即:
@@ -20,39 +20,37 @@ $$
2020
$$
2121
```
2222

23-
数值、字符、模拟信号均可处理成二进制数
23+
数值、字符、模拟信号均可转换为二进制形式
2424

2525
## 数值信息编码
2626

27-
整数值有“正数”与“负数”之分,而二进制数只有 `0` `1`,故而约定字节的最高位作为符号位,用 `0` 表示 `+`(正号)`1` 表示 `-`(负号)。实数在计算机中被表示为浮点数
27+
整数包含正数和负数,而二进制仅由 `0` `1` 构成,因此约定字节最高位为符号位(`0` 表示正`1` 表示负)。实数在计算机中通常以浮点数形式表示
2828

2929
## 字符信息编码
3030

31-
字符(如汉字、英文等自然语言、控制字符等)被处理成为 **统一码** (Unicode)。即建立了字符到数字的映射关系,比如汉字 "权",被编码为数字 `26435`需要再映射为二进制码)。
31+
字符(包括汉字、英文等自然语言字符及控制字符)通过 **统一码**(Unicode)进行编码,建立字符与数字的一一映射关系。例如汉字 "权" 的Unicode编码为十进制数 `26435`最终需转换为二进制形式存储)。
3232

3333
## 模拟信号编码
3434

3535
在计算机中,将模拟信号(声音、图形、视频等,也被称为 **连续信号**)转换为二进制数的过程称为数字化处理。
3636

3737
采样
38-
: 即将模拟信号表示成离散的符号序列
38+
: 将连续的模拟信号(如声音、图像)转换为离散符号序列的过程
3939

40-
采样过程是在固定的时间间隔内,对模拟信号截取一个振幅值,并用定长的二进制数表示。
41-
42-
截取模拟信号振幅值的过程称为采样。所得的的振幅值为采样值。
40+
具体操作是在固定时间间隔内,截取模拟信号的振幅值,并以定长二进制数表示该值。截取得到的振幅值即为采样值。
4341

4442
量化
45-
: 指的是将信号样本值截取为最接近原信号的整数值过程
43+
: 将采样得到的连续振幅值近似为最接近的整数值的过程
4644

47-
声音的采样和量化输出的是数字序列。图像针对像素点采样方式可以输出二值图(一个像素点存储为一个比特)、灰度图(一个像素点存储为一个字节)、彩色图等(一个像素点存储为三个字节)。
45+
声音经采样和量化后输出数字序列;图像则根据像素点采样精度,可输出二值图(单比特/像素)、灰度图(单字节/像素)或彩色图(三字节/像素,分别表示红、绿、蓝通道)。
4846

4947
## 指令
5048

5149
指示
52-
: 我们想要某些工作正常运作,需要一些给以它一些指示
50+
: 为使设备或系统正常运行,需要提供的明确操作说明
5351

54-
既然字符、数值、模拟信号均可被转换为二进制数字,那么同样可以将“指示”转换为二进制数字。被转换后的“指示”便是“指令”。
52+
由于字符、数值、模拟信号均可转换为二进制形式,操作“指示”同样可转换为二进制数字,这种转换后的指示即为计算机可识别的“指令”。
5553

5654
## 小结
5755

58-
可以观看视频:[如何数字化信息](https://www.zhihu.com/zvideo/1456755277366792192) 了解更多
56+
可点击视频 [如何数字化信息](https://www.zhihu.com/zvideo/1456755277366792192) 深入了解相关原理

doc/start/use.md

Lines changed: 31 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,46 +3,38 @@
33
C++ 是一种编译语言。要想运行一段 C++ 程序,需要首先使用 **编译器****源文件** 转换为 **对象文件** (也称为目标文件,但我觉得 “对象文件” 更加契合其表达的含义),然后再用 **链接器** 把这些对象文件组合生成 **可执行文件**
44

55
```{mermaid}
6-
stateDiagram-v2
7-
source: 源代码
8-
state source {
9-
s1: 源文件1
10-
s2: 源文件2
11-
}
6+
stateDiagram
7+
direction TB
8+
state input <<fork>>
9+
state output <<join>>
10+
state source {
11+
direction TB
12+
s1
13+
s2
14+
}
15+
state object {
16+
direction TB
17+
o1
18+
o2
19+
}
20+
[*] --> input
21+
input --> s1
22+
input --> s2
23+
s1 --> o1:编译
24+
s2 --> o2:编译
25+
o1 --> output
26+
o2 --> output
27+
output --> e:链接
28+
e --> [*]
29+
s1:源文件1
30+
s2:源文件2
31+
o1:对象文件1
32+
o2:对象文件2
33+
e:可执行文件
34+
note left of source : 可移植,文件后缀可以是 .cc、.cpp、.h 等
35+
note left of object : 不可移植,文件后缀可以是 .o、.obj 等
36+
note left of e : 适用于特定的硬件/系统,不可移植
1237
13-
object: 对象文件
14-
state object {
15-
o1: 对象文件1
16-
o2: 对象文件2
17-
}
18-
19-
e: 可执行文件
20-
21-
state input <<fork>>
22-
[*] --> input
23-
input --> s1
24-
input --> s2
25-
26-
s1 --> o1: 编译
27-
s2 --> o2: 编译
28-
29-
state output <<join>>
30-
o1 --> output
31-
o2 --> output
32-
output --> e: 链接
33-
e --> [*]
34-
35-
note left of source
36-
可移植,文件后缀可以是 `.cc`、`.cpp`、`h` 等
37-
end note
38-
39-
note left of object
40-
不可移植,文件后缀可以是 `.o`、`.obj` 等
41-
end note
42-
43-
note left of e
44-
适用于特定的硬件/系统,不可移植
45-
end note
4638
```
4739

4840
由编译器发现的错误称为 **编译时错误**,由链接器发现的错误错误 **链接时错误**,直到程序运行时才发现的错误称为 **运行时错误****逻辑错误**

doc/wiki/BitWidth.ipynb

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {},
6+
"source": [
7+
"# 计算之比特位宽\n",
8+
"\n",
9+
"参考:[计算之比特位宽](https://chenzomi12.github.io/02Hardware01Foundation/06BitWidth.html)\n",
10+
"\n",
11+
"数据比特位宽是C++中非常重要的概念,理解它对于内存优化、位运算以及底层编程都很关键。"
12+
]
13+
},
14+
{
15+
"cell_type": "markdown",
16+
"metadata": {},
17+
"source": [
18+
"```{admonition} 比特与字节\n",
19+
"- **比特(bit)**:计算机最小存储单位,只有 0 或 1 两种状态。\n",
20+
"- **字节(Byte)**:由 8 个比特组成(`1Byte = 8bit`)。\n",
21+
"- **字长(Word)**:CPU 一次能处理的数据宽度(如 32位 / 64位系统)。\n",
22+
"```\n",
23+
"\n",
24+
"## C++ 基本数据类型的位宽**\n",
25+
"不同数据类型占用的比特数不同,可通过 `sizeof()` 查看字节数(需乘以 8 转换为比特)。"
26+
]
27+
},
28+
{
29+
"cell_type": "code",
30+
"execution_count": null,
31+
"metadata": {},
32+
"outputs": [
33+
{
34+
"name": "stdout",
35+
"output_type": "stream",
36+
"text": [
37+
"bool: 8 bits\n",
38+
"char: 8 bits\n",
39+
"int: 32 bits\n",
40+
"float: 32 bits\n",
41+
"double: 64 bits\n"
42+
]
43+
},
44+
{
45+
"data": {
46+
"text/plain": [
47+
"@0x7f2d49185ca0"
48+
]
49+
},
50+
"execution_count": 1,
51+
"metadata": {},
52+
"output_type": "execute_result"
53+
}
54+
],
55+
"source": [
56+
"#include <iostream>\n",
57+
"using namespace std;\n",
58+
"\n",
59+
"cout << \"bool: \" << sizeof(bool) * 8 << \" bits\" << endl; // 通常 8 位\n",
60+
"cout << \"char: \" << sizeof(char) * 8 << \" bits\" << endl; // 8 位\n",
61+
"cout << \"int: \" << sizeof(int) * 8 << \" bits\" << endl; // 通常 32 位\n",
62+
"cout << \"float: \" << sizeof(float) * 8 << \" bits\" << endl; // 32 位\n",
63+
"cout << \"double: \" << sizeof(double) * 8 << \" bits\" << endl; // 64 位"
64+
]
65+
},
66+
{
67+
"cell_type": "markdown",
68+
"metadata": {},
69+
"source": [
70+
"## 位宽与数值范围的关系\n",
71+
"数据类型的位宽决定了其能表示的数值范围。例如:\n",
72+
"- **无符号整数(`unsigned`)**:$n$ 位可表示 $0$ 到 $2^n-1$。\n",
73+
"- **有符号整数**:$n$ 位可表示 $-2^{n-1}$ 到 $2^{n-1} - 1$(补码表示)。"
74+
]
75+
},
76+
{
77+
"cell_type": "markdown",
78+
"metadata": {},
79+
"source": [
80+
"**示例**:\n",
81+
"- `unsigned char`(8位):范围 `0` 到 `255`($2^8-1$)。\n",
82+
"- `int`(32位):范围 $-2,147,483,648$ 到 $2,147,483,647$|。"
83+
]
84+
},
85+
{
86+
"cell_type": "markdown",
87+
"metadata": {},
88+
"source": [
89+
"## 位运算操作\n",
90+
"位运算直接操作数据的二进制位,常用运算符:\n",
91+
"- `&`(按位与)、`|`(按位或)、`^`(按位异或)、`~`(取反)。\n",
92+
"- `<<`(左移)、`>>`(右移)。"
93+
]
94+
},
95+
{
96+
"cell_type": "markdown",
97+
"metadata": {},
98+
"source": [
99+
"**示例:提取比特位**"
100+
]
101+
},
102+
{
103+
"cell_type": "code",
104+
"execution_count": 2,
105+
"metadata": {},
106+
"outputs": [
107+
{
108+
"name": "stdout",
109+
"output_type": "stream",
110+
"text": [
111+
"第2位是: 1\n"
112+
]
113+
}
114+
],
115+
"source": [
116+
"unsigned int num = 21; // 二进制: 0001 0101\n",
117+
"bool bit2 = (num & (1 << 2)) != 0; // 提取第2位(从0开始)\n",
118+
"cout << \"第2位是: \" << (bit2 ? \"1\" : \"0\") << endl; "
119+
]
120+
},
121+
{
122+
"cell_type": "markdown",
123+
"metadata": {},
124+
"source": [
125+
"## 位域(Bit Fields)\n",
126+
"\n",
127+
"用于在结构体中精确控制成员变量占用的比特数,节省内存。"
128+
]
129+
},
130+
{
131+
"cell_type": "code",
132+
"execution_count": 3,
133+
"metadata": {},
134+
"outputs": [
135+
{
136+
"name": "stdout",
137+
"output_type": "stream",
138+
"text": [
139+
"红色值: 30\n"
140+
]
141+
}
142+
],
143+
"source": [
144+
"struct Color {\n",
145+
" unsigned int red : 5; // 5位,范围0-31\n",
146+
" unsigned int green : 6; // 6位,范围0-63\n",
147+
" unsigned int blue : 5; // 5位,范围0-31\n",
148+
"};\n",
149+
"\n",
150+
"Color c = {30, 60, 28};\n",
151+
"cout << \"红色值: \" << c.red << endl;"
152+
]
153+
},
154+
{
155+
"cell_type": "markdown",
156+
"metadata": {},
157+
"source": [
158+
"## 底层编程应用\n",
159+
"- **内存对齐**:编译器可能会插入填充字节以对齐数据,影响实际内存占用。\n",
160+
"- **位掩码(Bitmask)**:用于标志位的组合,例如:"
161+
]
162+
},
163+
{
164+
"cell_type": "code",
165+
"execution_count": 4,
166+
"metadata": {},
167+
"outputs": [],
168+
"source": [
169+
"enum Flags {\n",
170+
" READ = 1, // 0001\n",
171+
" WRITE = 2, // 0010\n",
172+
" EXECUTE = 4 // 0100\n",
173+
"};\n",
174+
"\n",
175+
"int permissions = READ | WRITE; // 组合标志:0011\n",
176+
"bool canWrite = (permissions & WRITE) != 0; // 检查标志"
177+
]
178+
},
179+
{
180+
"cell_type": "markdown",
181+
"metadata": {},
182+
"source": []
183+
}
184+
],
185+
"metadata": {
186+
"kernelspec": {
187+
"display_name": "C++14",
188+
"language": "C++14",
189+
"name": "xcpp14"
190+
},
191+
"language_info": {
192+
"codemirror_mode": "text/x-c++src",
193+
"file_extension": ".cpp",
194+
"mimetype": "text/x-c++src",
195+
"name": "c++",
196+
"version": "14"
197+
}
198+
},
199+
"nbformat": 4,
200+
"nbformat_minor": 2
201+
}

0 commit comments

Comments
 (0)