一、使用c++标准库函数
1.任意进制转十进制
#include <string> #include <iostream>int main() { std::string num = "1a3f"; // 十六进制数 int decimal = stoi(num, nullptr, 16); // 第三个参数指定原始进制 std::cout << decimal; // 输出:6719 }
2.十进制转其他进制
#include <bitset> #include <iostream> int main() { int num = 255; // 转二进制(8位) std::cout << std::bitset<8>(num) << "\n"; // 11111111 // 转十六进制(小写) std::cout << std::hex << num << "\n"; // ff // 转八进制 std::cout << std::oct << num; // 377 }
二、自定义转换函数(支持任意2-36进制)
1. 十进制转任意进制
#include <algorithm> #include <string> std::string dec_to_base(int num, int base) { if (base < 2 || base > 36) return ""; std::string result; const char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; while (num > 0) { result += digits[num % base]; num /= base; } if (result.empty()) return "0"; std::reverse(result.begin(), result.end()); return result; } // 示例:dec_to_base(255, 16) 返回 "ff"
2. 任意进制转十进制
#include <cctype> #include <string> int base_to_dec(std::string num, int base) { if (base < 2 || base > 36) return -1; int result = 0; for (char c : num) { int value = isdigit(c) ? c - '0' : toupper(c) - 'a' + 10; if (value >= base) return -1; // 非法输入 result = result * base + value; } return result; } // 示例:base_to_dec("ff", 16) 返回 255
三、完整示例代码
#include <iostream> #include <algorithm> #include <string> using namespace std; // 十进制转任意进制(2-36) string dec_to_base(int num, int base) { if (base < 2 || base > 36) return "invalid base"; string result; const char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; do { result += digits[num % base]; num /= base; } while (num > 0); reverse(result.begin(), result.end()); return result.empty() ? "0" : result; } // 任意进制转十进制(2-36) int base_to_dec(string num, int base) { if (base < 2 || base > 36) return -1; int result = 0; for (char c : num) { int value = isdigit(c) ? c - '0' : toupper(c) - 'a' + 10; if (value >= base) return -1; result = result * base + value; } return result; } int main() { // 十进制255转十六进制 cout << dec_to_base(255, 16) << endl; // 输出ff // 二进制11111111转十进制 cout << base_to_dec("11111111", 2) << endl; // 输出255 // 三十六进制转换示例 cout << dec_to_base(1234, 36) << endl; // 输出ya cout << base_to_dec("ya", 36) << endl; // 输出1234 return 0; }
四、注意事项
有效性检查:需验证输入数值是否合法(如二进制不能包含2-9)
大小写处理:自定义函数默认处理大写字母,可修改toupper()为tolower()处理小写
负数处理:示例代码未处理负数,需要时可添加符号处理
大数支持:对于超过int范围的数值,建议使用字符串处理或long long类型
如果需要处理超大数(超过long long范围),需要使用字符串进行逐位计算的算法。这里展示的是最常用的基本实现方法。
五、方法补充
使用printf语句实现进制转换
在c语言中,printf 函数可以直接实现部分进制转换功能,通过格式说明符(format specifier)快速输出不同进制的数值。以下是详细使用方法及示例代码:
一、printf 原生支持的进制转换
1. 十进制、八进制、十六进制转换
#include <stdio.h> int main() { int num = 255; // 十进制输出(默认) printf("十进制: %d\n", num); // 255 // 八进制输出(无前缀) printf("八进制: %o\n", num); // 377 // 十六进制输出(小写字母) printf("十六进制: %x\n", num); // ff // 十六进制输出(大写字母) printf("十六进制: %x\n", num); // ff return 0; }
2. 显示进制前缀
#include <stdio.h> int main() { int num = 255; // 显示八进制前缀 0 printf("带前缀的八进制: %#o\n", num); // 0377 // 显示十六进制前缀 0x/0x printf("带前缀的十六进制: %#x\n", num); // 0xff printf("带前缀的十六进制: %#x\n", num); // 0xff return 0; }
3. 指定输出宽度和填充
#include <stdio.h> int main() { int num = 15; // 输出8位宽度,不足部分补前导零 printf("补零的八进制: %#08o\n", num); // 0000017 printf("补零的十六进制: %#08x\n", num); // 0x00000f return 0; }
二、printf 不支持的进制转换
1. 二进制输出(需要手动实现)
#include <stdio.h> void print_binary(unsigned int num) { if (num > 1) print_binary(num >> 1); putchar((num & 1) ? '1' : '0'); } int main() { int num = 10; printf("二进制: "); print_binary(num); // 1010 return 0; }
2. 任意进制转换(通用方法)
#include <stdio.h> #include <string.h>void reverse(char* str) { int len = strlen(str); for (int i = 0; i < len/2; i++) { char temp = str[i]; str[i] = str[len-1 - i]; str[len-1 - i] = temp; } } void dec_to_base(unsigned int num, int base, char* output) { if (base < 2 || base > 36) { strcpy(output, "invalid base"); return; } const char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; int index = 0; do { output[index++] = digits[num % base]; num /= base; } while (num > 0); output[index] = '\0'; reverse(output); } int main() { char buffer[32]; dec_to_base(255, 2, buffer); printf("二进制: %s\n", buffer); // 11111111 return 0; }
三、输入其他进制的数值(scanf 的用法)
#include <stdio.h> int main() { int num; // 输入十六进制数(如 ff) printf("输入十六进制数: "); scanf("%x", &num); printf("十进制值: %d\n", num); // 255 // 输入八进制数(如 377) printf("输入八进制数: "); scanf("%o", &num); printf("十进制值: %d\n", num); // 255 return 0; }
四、注意事项
类型限制:
使用 %o, %x, %x 时,建议用 unsigned 类型,避免符号扩展问题:
unsigned int num = 255; printf("%#x\n", num); // 正确输出 0xff
二进制输出优化:
// 使用宏定义快速输出二进制 #define print_binary(n) \ for (int i = sizeof(n)*8-1; i >= 0; i--) \ putchar((n & (1 << i)) ? '1' : '0'); \ putchar('\n') int main() { print_binary(10); // 00000000000000000000000000001010 return 0; }
大数处理:
对于超过 unsigned int 范围的数值,需使用字符串处理(类似 python 的 int(string, base))。
通过 printf 可以直接实现八进制、十六进制的输出,二进制和其他进制需要手动实现。若需更复杂的进制转换(如浮点数转换或超大数处理),需结合字符串操作或数学库函数。
以上就是c++教程之进制转换的实现方法的详细内容,更多关于c++进制转换的资料请关注代码网其它相关文章!
发表评论