编码是信息处理中的基本操作:
编码的主要分类:
计算机内部使用原码、反码和补码三种方式来表示数字。正数的三种编码完全相同,区别在于负数的表示方式。
原码是最直观的二进制表示方式:
以 8 位原码为例:
| 编码类型 | 数值 | 编码 |
|---|---|---|
| 原码 | 5 | 00000101 |
| 原码 | -5 | 10000101 |
反码的规则如下:
以 8 位反码为例:
| 编码类型 | 数值 | 编码 |
|---|---|---|
| 反码 | 5 | 00000101 |
| 反码 | -5 | 11111010 |
补码是计算机中最常用的数字编码方式:
以 8 位补码为例:
| 编码类型 | 数值 | 编码 |
|---|---|---|
| 补码 | 5 | 00000101 |
| 补码 | -5 | 11111011 |
记忆口诀:
以 8 位编码为例,完整对比如下:
| 编码类型 | 数值 | 编码 |
|---|---|---|
| 原码 | 5 | 00000101 |
| 原码 | -5 | 10000101 |
| 反码 | 5 | 00000101 |
| 反码 | -5 | 11111010 |
| 补码 | 5 | 00000101 |
| 补码 | -5 | 11111011 |
位运算是对二进制数中的位进行操作的方式,是计算机内部高效的运算方式。可以与赋值运算符结合成为位运算赋值运算符。
| 运算 | 符号 | 操作 | 含义 | 示例 |
|---|---|---|---|---|
| 与 | & | 逐位与(双目) | 两个对应位都为1时为1 | 5 & 6 = (100)₂ = 4 |
| 或 | `\ | ` | 逐位或(双目) | 两个对应位中有一个为1时就为1 |
| 异或 | ^ | 逐位异或(双目) | 两个对应位不同时才为1 | 5 ^ 6 = (011)₂ = 3 |
| 取反 | ~ | 逐位非(单目) | 将补码中的0和1全部取反 | ~5 = -6,~(-5) = 4 |
| 左移 | << | 逐位左移(双目) | 将二进制向左移动 i 位 | 5 << 1 = (00001010)₂ = 10 |
| 右移 | >> | 逐位右移(双目) | 将二进制向右移动 i 位 | 5 >> 1 = (00000010)₂ = 2 |
字符编码用于将字符映射为数字,常见的字符编码标准包括:
| 编码标准 | 覆盖范围 | 编码数量 | 说明 |
|---|---|---|---|
| ASCII | 英文字母、数字、符号 | 128 个 | 最基础的字符编码,1 个字节 |
| GBK | 简体中文 | 约 21000 个汉字 | 国标编码,2 个字节表示一个汉字 |
| BIG5 | 繁体中文 | 约 13000 个汉字 | 港台地区使用 |
| Unicode | 世界上大多数文字 | 超过 14 万字符 | 统一码,UTF-8/UTF-16/UTF-32 是其编码方案 |
ASCII 常用编码值:
| 字符 | ASCII 值 | 字符 | ASCII 值 | 字符 | ASCII 值 |
|---|---|---|---|---|---|
\0(空字符) | 0 | 0 | 48 | A | 65 |
| 空格 | 32 | 9 | 57 | Z | 90 |
\n(换行) | 10 | a | 97 | z | 122 |
记忆技巧:0<A<a,即数字 < 大写字母 < 小写字母。大写字母和对应小写字母之间相差 32(例如A(65) 和a(97))。
| 类型 | 格式 | 特点 |
|---|---|---|
| 图像 | jpg(jpeg) | 有损压缩,适合照片 |
| 图像 | png | 无损压缩,支持透明 |
| 图像 | gif | 支持动画,颜色有限(256色) |
| 音频 | mp3 | 有损压缩,文件小,最常用 |
| 音频 | aac | 有损压缩,比 mp3 音质更好 |
| 音频 | wav | 无损格式,文件大,音质最好 |
| 视频 | mp4 | 最通用的视频格式 |
| 视频 | avi | 较老的格式,兼容性好 |
| 视频 | mkv | 开放格式,支持多音轨/字幕 |
| 标准 | 代表格式 | 应用场景 |
|---|---|---|
| MPEG-1 | mp3 | 音频压缩 |
| MPEG-4 | mp4 | 视频压缩 |
| H.264/AVC | - | 高清视频传输(4K、8K) |
| H.265/HEVC | - | 超高清视频,压缩率比 H.264 提升约 50% |
压缩编码通过特定算法减小数据体积,便于存储和传输:
| 压缩算法 | 对应格式 | 压缩类型 | 说明 |
|---|---|---|---|
| DEFLATE | ZIP | 无损压缩 | 最常见的通用压缩算法 |
| RAR | RAR | 无损压缩 | 压缩率通常比 ZIP 略高 |
| 哈夫曼编码 | - | 无损压缩 | 基于字符出现频率,高频字符用短编码 |
| LZ77/LZ78 | - | 无损压缩 | 基于重复字符串的替换,DEFLATE 的基础 |
第1步:求原码
第2步:求反码
第3步:求补码
完整对比表:
| 编码 | +13 | -13 |
|---|---|---|
| 原码 | 00001101 | 10001101 |
| 反码 | 00001101 | 11110010 |
| 补码 | 00001101 | 11110011 |
先将 5 和 6 转为二进制:
按位与(&):两位都为 1 才为 1
101 (5)
& 110 (6)
-----
100 (4)按位或(|):至少一位为 1 就为 1
101 (5)
| 110 (6)
-----
111 (7)按位异或(^):两位不同才为 1
101 (5)
^ 110 (6)
-----
011 (3)5 << 1:将 101 左移 1 位 → 1010 = 10(相当于乘以 2)5 >> 1:将 101 右移 1 位 → 10 = 2(相当于除以 2,向下取整)5 << 2:将 101 左移 2 位 → 10100 = 20(相当于乘以 4)规律: 左移 k 位相当于乘以 2^k,右移 k 位相当于除以 2^k(向下取整)。
例题:求 -20 的 8 位补码
解题步骤:
验证方法: 用补码还原回十进制
例题:用位运算判断一个整数是奇数还是偶数
if (n & 1) {
cout << "奇数" << endl;
} else {
cout << "偶数" << endl;
}原理: 任何整数的二进制最低位为 1 则是奇数,为 0 则是偶数。n & 1 取出最低位进行判断,比 n % 2 更高效。
&、|、^ 的优先级低于比较运算符。if (a & 1 == 1) 实际上是 if (a & (1 == 1)),应该写成 if ((a & 1) == 1)1 << 31 在 int 类型中会变成负数格雷码(Gray Code)是由贝尔实验室的弗兰克·格雷在 1947 年发明的,又称反射二进制码,是一种特殊的二进制编码系统。
格雷码的特点:
主要应用:数字系统错误检测、模拟数字转换、位置编码。
k 位格雷码,从全 0 开始交替执行以下两步:
重复操作 1 和 2 共 2^k - 1 次后,完成编码。
从 1 位格雷码 0、1 开始,逐步扩展:
重复 k-1 次补位操作后完成编码。
镜像构造过程示例:
| 1位(起始) | 2位(镜像+补位) | 3位(镜像+补位) |
|---|---|---|
| 0 | 00 | 000 |
| 1 | 01 | 001 |
| 11 | 011 | |
| 10 | 010 | |
| 110 | ||
| 111 | ||
| 101 | ||
| 100 |
工作原理:
g(n) = n ^ (n >> 1);工作原理:
bin[0] = gray[0];
for (int i = 1; i < k; ++i) {
bin[i] = bin[i - 1] ^ gray[i];
}