详细题解 | 二进制转八进制
2025-11-23 18:24:21
发布于:广东
123阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
// 函数名:b2d (binary to decimal)
// 功能:将三个字符形式的二进制位('0' 或 '1')转换为对应的十进制整数
// 参数:c1, c2, c3 - 分别代表一个3位二进制数的百位、十位和个位
// 返回值:转换后的十进制整数(范围在 0-7 之间)
int b2d(char c1, char c2, char c3) {
int v = 0; // 用于存储计算结果的变量
// 'c1 - '0'' 可以将字符 '0' 或 '1' 转换为整数 0 或 1
// 3位二进制数的权重分别是 4 (2^2), 2 (2^1), 1 (2^0)
v += (c1 - '0') * 4; // 计算最高位的数值并累加到结果 v 中
v += (c2 - '0') * 2; // 计算中间位的数值并累加到结果 v 中
v += (c3 - '0') * 1; // 计算最低位的数值并累加到结果 v 中
return v; // 返回最终的十进制结果
}
int main() {
string s; // 定义一个字符串 s,用于接收输入的二进制数字符串
cin >> s; // 从标准输入(键盘)读取二进制数字符串
int l = s.size(); // 获取字符串 s 的长度,即二进制数的位数
// 计算需要在字符串左侧补多少个 '0',使其总长度成为3的倍数
// (3 - l % 3) 计算出余数与3的差值。例如,如果余1,差是2;如果余2,差是1;如果余0,差是3。
// % 3 是为了处理余数为0的情况,此时 (3 - 0) % 3 = 0,即不需要补零。
int p = (3 - l % 3) % 3;
// 在原字符串 s 的前面拼接 p 个 '0'
// string(p, '0') 会创建一个包含 p 个 '0' 的临时字符串
s = string(p, '0') + s;
string o; // 定义一个字符串 o,用于存储最终的八进制结果
// 循环遍历处理后的二进制字符串,每次步长为3
// i 从 0 开始,依次为 0, 3, 6, ...,确保每次处理3个连续的字符
for (int i = 0; i < s.size(); i += 3) {
// 调用 b2d 函数,将当前位置开始的3个字符转换为十进制数
int d = b2d(s[i], s[i+1], s[i+2]);
// 将得到的十进制数 d 转换为对应的字符('0' 到 '7')
// '0' + d 是一个常用技巧,例如 '0' + 5 的结果就是字符 '5'
// 然后将这个字符追加到结果字符串 o 的末尾
o += '0' + d;
}
cout << o; // 输出最终的八进制字符串结果
return 0; // 程序正常结束
}
- 补零逻辑正确:
(3 - l % 3) % 3这个表达式非常巧妙地计算出了需要补充的前导零的数量,确保了任何长度的二进制数都能被3整除。 - 转换函数正确:
b2d函数通过字符运算c - '0'将字符转换为整数,并正确地乘以了每一位的权重(4, 2, 1),最终得到了正确的十进制值。 - 主循环逻辑正确:
for循环以3为步长遍历整个字符串,每次提取3个字符进行转换,然后将结果拼接起来,整个流程完全符合二进制到八进制的转换规则。
无注释版本:
#include <bits/stdc++.h>
using namespace std;
int b2d(char c1, char c2, char c3) {
int v = 0;
v += (c1 - '0') * 4;
v += (c2 - '0') * 2;
v += (c3 - '0') * 1;
return v;
}
int main() {
string s;
cin >> s;
int l = s.size();
int p = (3 - l % 3) % 3;
s = string(p, '0') + s;
string o;
for (int i = 0; i < s.size(); i += 3) {
int d = b2d(s[i], s[i+1], s[i+2]);
o += '0' + d;
}
cout << o;
return 0;
}
这里空空如也






有帮助,赞一个