计算机编码-知识总结 概念 广义:把信息从一种格式转换为另外一种格式 狭义:把信息用二进制数表示 作用:方便存储、传输、解析
分类 数字编码 字符编码 多媒体编码 压缩编码
数字编码 计算机内部数字编码 原码 正数的原码是其二进制表示 负数的原码是在正数的原码基础上将其最高位变成1
以8位原码为例
编码类型
数值
编码
原码
5
00000101
原码
-5
10000101
反码 正数的反码是其二进制表示 负数的原码是将其对应正数的反码为一位都取反
以8位反码为例
编码类型
数值
编码
反码
5
00000101
反码
-5
11111010
补码 正数的补码是其二进制表示 负数的补码是其反码加1
以8位补码为例
编码类型
数值
编码
补码
5
00000101
补码
-5
11111011
三种数字编码的总结 口诀: 正数三码均相同 原码负数最左边 反码正负恰相反 补码负数反加一
以8位编码为例:
编码类型
数值
编码
原码
5
00000101
原码
-5
10000101
反码
5
00000101
反码
-5
11111010
补码
5
00000101
补码
-5
11111011
位运算 位运算是对二进制数中的位进行操作的方式,是计算机内部高效的运算方式。可以与复制运算符结合成为位运算复制运算符。位运算总结如下:
运算
符号
操作
含义
示例
与
&
逐位与(双目运算)
两个对应位都为1时为1
5&6=(100)(2)=4
或
|
逐位或(双目运算)
两个对应位中有一个为1时就为1
5|6=(111)(2)=7
异或
^
逐位异或(双目运算)
两个对应位不同时才为1
5^6=(011)(2)=3
取反
~
逐位非(单目运算)
将一个数补码中的0和1全部取反
5的补码=(00000101)(2) ~5=(11111010)(2)=-6 -5的补码=(11111011)(2) ~(-5)=(00000100)(2)=4
左移
<<
逐位左移(双目运算)
将一个数的二进制向左移动i位
5<<1=(00001010)(2)=10
右移
>
逐位右移(双目运算)
将一个数的二进制向右移动i位
5>>1=(00000010)(2)=2
格雷码 格雷码-知识总结
字符编码 ASCII码:128个编码,常用英文、数字、特殊符号 ASCII码:\0(0)、 0(48)、A(65)、a(97) 汉字编码:GBK国标、BIG5繁体、CJK中日韩 Unicode:统一码,世界上大多数文字系统 另外关于Unicode,需要知道UTF-8、 UTF-16、 UTF-32是其编码方案。
多媒体编码 编码格式 图像:jpg(jpeg)、png、gif 音频:mp3、acc、wav 视频:mp4、avi、mkv 编码标准 MPEG:MPEG-1(mp3)、MPEG-4(mp4) H.264/AVC:4K、8K传输
压缩编码 DEFLATE:ZIP文件压缩编码算法 RAR:RAR文件压缩编码算法 哈夫曼编码:基于字符出现频率的压缩编码算法
格雷码-知识总结 概念 格雷码是由贝尔实验室的弗兰克·格雷在1947年发明的,又称反射二进制码,是一种二进制数字编码系统。具有单步变化性和循环性,即两个连续的数值编码仅有一位二进制数不同,并且最大值和最小值之间编码仅有一位二进制数不同。主要用于数字系统错误检测、模拟数字转换、位置编码。
格雷码构造方法 手动构造法 k位格雷码,从全0开始构造交替执行: ① 翻转最低位得到下一个格雷码 ② 翻转最右边的1的左边的位得到下一个格雷码 重复操作①②共2(k)-1次后,完成编码
镜像构造法 从1位格雷码0、1开始: ① 将k-1位格雷码上下镜像 ② 前k个格雷码左边补0 ③ 后k个格雷码左边补1 重复k-1次补位操作后完成编码
操作
起始
镜像
补位
镜像
补位
位数
1位
2位
2位
2位
3位
格雷码
0 1
0 1 1 0
00 01 11 10
00 01 11 10 10 11 01 00
000 001 011 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];
}错误的题目要弄懂,不会的千万要来问老师⚠️
总结作业非常重要,请务必认真完成✔️
考试只有一次提交机会,请务必本地检查正确后再提交❇️
请在AC后或者思考15分钟没有进展后查看,不可抄代码❇️
计算机编码与格雷码-选择题 如果 a 为 int 类型的变量,且 a 的值为6,则执行a = ~a; 之后,a的值会 是( )。 A. -6 B. 6 C. -7 D. 7
已知大写字符'A'的ASCII编码的十六进制表示为0x41 ,则字符'L'的ASCII编 码的十六进制表示为 ( ) 。 A. 4A B. 4B C. 4C D. 52
数据编码方式只有原码、反码、补码三种。 A. 正确 B. 错误
已知字符 '0' 的ASCII编码的十进制表示为48,则执行下面C++代码后,输出是( )。 截屏2024-06-21 15.06.37.png
A. 10 B. 58 C. 154 D. 316
8进制补码10101011表示的二进制数是多少? A. 43 B. -85 C. -43 D. -84
在C++语言中,位运算符也有类似“先乘除、后加减”的优先级规则。因此, 使用时应注意合理使用括号。 A. 正确 B. 错误
在C++语言中,所有int类型的值,经过若干次左移操作(<<)后,它们的值 总会变为0。 A. 正确 B. 错误
如果a为int类型的变量,且表达式((a & 1) == 0) 的值为true,则说明a是偶数。 A. 正确 B. 错误
一个 int 类型的值,做以下哪个操作,一定会变回原来的值?( A. 左移3位,再右移3位 B. 右移3位,再左移3位 C. 按位或 7,再按位与-8 D. 按位异或 7,再按位异或 7
在下列代码的横线处填写(),可以使得输出是“24 12”。 截屏2024-06-21 15.31.39.png
A. a=a^b B. b=a^b C. a=a+b D. b=a+b
计算机编码与格雷码-选择题答案 C 解析:本题属于考察C++位运算知识。6按位取反运算,注意符号位也取反, 呈现的是补码,转换过来就是-7。具体过程: 00000110(取反操作) 11111001(补码) 11111000(补码-1=反码) 10000111(负数的原码,注意此时取反符号位不变) C 解析:‘A’的ASCII值是65,可以推出‘ L’是76,将其转换成16进制,答案是C B 解析:数据编码的方式非常多,例如格雷码、 哈夫曼编码等,它们适合使用的场景各不相同,所以本题错误 C 解析:由'0'的ASCII码可以推算出'3','1','6'的ASCII码,相加即可得到答案C B 解析:10101011(补码) 10101010 (补码-1=反码) 11010101(原码) 最高位为符号位,即-(64+16+4+1)=-85 A 解析:为了避免混淆和错误,建议使用括号来明确指定运算的顺序,特别是在复杂的表达式中。 A 解析:本题是计算机位运算知识,左移后,后面的位数用0补充,所以移动若 干次,都会变成0 A 解析:本题是计算机位运算和比较运算符知识,a是整数,只有是偶数和1做与 运算的结果才等于0。 D 解析:本题属于考察计算机基础知识中的位运算相关概念,A 选项可能存在越 界的问题,B 选项会将低位的 3 位清零,C 选项肯定是错的,D 选项异或两次 7 等同于原数,所以本题正确答案为 D B 解析:本题属于考察计算机基础知识中的位运算相关概念,因为异或运算中 a^a=0;a^0=a,当选项为 B 时,第 5 行 b'=(a^b),第 6 行 a'=a^b'=a^(a^b)=b,第 7 行 b"=a^b'=b^(a^b)=a,正好对 a、b 进行了交换。所以本题正确答案为 B
L2123题解+参考代码 题目链接 2进制中的0和1:L2123
题解 我们需要计算一个整数 n 转换为二进制后有多少个 0 和多少个 1。可以通过逐位检查 n 的二进制表示来实现。
算法步骤 读取输入:读取一个整数 n。 初始化计数器:初始化两个计数器 count0 和 count1,分别用于记录 0 和 1 的数量。 逐位检查 n 的二进制表示: 使用循环逐位检查 n 的二进制表示。 如果当前位是 0,count0 加 1;如果当前位是 1,count1 加 1。 通过右移 n 来逐位检查,直到 n 为 0。 输出结果:输出 count0 和 count1。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <iostream>
2using namespace std;
3
4int main() {
5 // 读取输入
6 int n;
7 cin >> n;
8
9 // 初始化计数器
10 int count0 = 0, count1 = 0;
11
12 // 逐位检查 n 的二进制表示
13 if (n == 0) {
14 count0 = 1;
15 } else {
16 while (n > 0) {
17 if (n % 2 == 0) {
18 count0++;
19 } else {
20 count1++;
21 }
22 n /= 2;
23 }
24 }
25
26 // 输出结果
27 cout << count0 << " " << count1 << endl;
28
29 return 0;
30}L2124题解+参考代码 题目链接 二进制的折半交换:L2124
题解 题目要求我们将一个小于 2^32 的正整数的高低位进行交换。32 位的二进制数可以分为高位和低位,每部分各 16 位。将这两部分交换后重新组合成一个新的数,并以十进制形式输出。
算法步骤 读取输入:读取一个正整数 n。 提取高位和低位: 高位是 n 右移 16 位,即 n >> 16。 低位是 n 取低 16 位,即 n & 0xFFFF。 交换高低位: 交换后的数是将低位左移 16 位,加上高位,即 (low << 16) | high。 输出结果:输出交换后的新数。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4int main() {
5 // 读取输入
6 unsigned int n;
7 cin >> n;
8
9 // 提取高位和低位
10 unsigned int high = n >> 16; // 高位
11 unsigned int low = n & 0xFFFF; // 低位
12
13 // 交换高低位
14 unsigned int result = (low << 16) | high;
15
16 // 输出结果
17 cout << result << endl;
18
19 return 0;
20}