当前位置: 首页 > article >正文

c++进制转换

在 C++ 中,进制转换是一个常见的需求,通常涉及将数字从一种进制(如十进制)转换为另一种进制(如二进制、八进制、十六进制)。以下是常用的进制转换模板和示例:


1. 将十进制转换为其他进制

1.1 使用 std::bitset 转换为二进制

std::bitset 可以方便地将整数转换为二进制字符串。

#include <iostream>
#include <bitset>

int main() {
    int num = 42;

    // 将十进制转换为二进制(8位)
    std::bitset<8> binary(num);
    std::cout << "Binary: " << binary << std::endl; // 00101010

    return 0;
}

1.2 使用 std::ostringstream 转换为任意进制

通过 std::ostringstreamstd::setbase 可以将整数转换为任意进制(2、8、10、16)。

#include <iostream>
#include <sstream>
#include <iomanip> // std::setbase

int main() {
    int num = 42;

    // 转换为二进制
    std::ostringstream binary;
    binary << std::setbase(2) << num;
    std::cout << "Binary: " << binary.str() << std::endl; // 101010

    // 转换为八进制
    std::ostringstream octal;
    octal << std::setbase(8) << num;
    std::cout << "Octal: " << octal.str() << std::endl; // 52

    // 转换为十六进制
    std::ostringstream hex;
    hex << std::setbase(16) << num;
    std::cout << "Hexadecimal: " << hex.str() << std::endl; // 2a

    return 0;
}

1.3 手动实现进制转换

通过循环和取模运算,可以手动实现任意进制的转换。

#include <iostream>
#include <string>
#include <algorithm>

std::string decimalToBase(int num, int base) {
    if (num == 0) return "0";

    std::string result;
    while (num > 0) {
        int remainder = num % base;
        char digit = (remainder < 10) ? ('0' + remainder) : ('A' + remainder - 10);
        result.push_back(digit);
        num /= base;
    }

    // 反转字符串
    std::reverse(result.begin(), result.end());
    return result;
}

int main() {
    int num = 42;

    std::cout << "Binary: " << decimalToBase(num, 2) << std::endl;  // 101010
    std::cout << "Octal: " << decimalToBase(num, 8) << std::endl;   // 52
    std::cout << "Hexadecimal: " << decimalToBase(num, 16) << std::endl; // 2A

    return 0;
}

2. 将其他进制转换为十进制

2.1 使用 std::stoistd::stol

std::stoistd::stol 可以将字符串从指定进制转换为十进制。

#include <iostream>
#include <string>

int main() {
    std::string binary = "101010";
    std::string octal = "52";
    std::string hex = "2A";

    // 二进制转十进制
    int decimal1 = std::stoi(binary, nullptr, 2);
    std::cout << "Binary to Decimal: " << decimal1 << std::endl; // 42

    // 八进制转十进制
    int decimal2 = std::stoi(octal, nullptr, 8);
    std::cout << "Octal to Decimal: " << decimal2 << std::endl; // 42

    // 十六进制转十进制
    int decimal3 = std::stoi(hex, nullptr, 16);
    std::cout << "Hexadecimal to Decimal: " << decimal3 << std::endl; // 42

    return 0;
}

2.2 手动实现进制转换

通过循环和幂运算,可以手动实现任意进制到十进制的转换。

#include <iostream>
#include <string>
#include <cmath>

int baseToDecimal(const std::string& num, int base) {
    int decimal = 0;
    for (size_t i = 0; i < num.length(); i++) {
        char c = num[i];
        int digit = (c >= '0' && c <= '9') ? (c - '0') : (c - 'A' + 10);
        decimal = decimal * base + digit;
    }
    return decimal;
}

int main() {
    std::string binary = "101010";
    std::string octal = "52";
    std::string hex = "2A";

    std::cout << "Binary to Decimal: " << baseToDecimal(binary, 2) << std::endl; // 42
    std::cout << "Octal to Decimal: " << baseToDecimal(octal, 8) << std::endl;   // 42
    std::cout << "Hexadecimal to Decimal: " << baseToDecimal(hex, 16) << std::endl; // 42

    return 0;
}

3. 任意进制之间的转换

可以通过十进制作为中间桥梁,实现任意进制之间的转换。

#include <iostream>
#include <string>
#include <algorithm>

// 十进制转任意进制
std::string decimalToBase(int num, int base) {
    if (num == 0) return "0";

    std::string result;
    while (num > 0) {
        int remainder = num % base;
        char digit = (remainder < 10) ? ('0' + remainder) : ('A' + remainder - 10);
        result.push_back(digit);
        num /= base;
    }

    std::reverse(result.begin(), result.end());
    return result;
}

// 任意进制转十进制
int baseToDecimal(const std::string& num, int base) {
    int decimal = 0;
    for (size_t i = 0; i < num.length(); i++) {
        char c = num[i];
        int digit = (c >= '0' && c <= '9') ? (c - '0') : (c - 'A' + 10);
        decimal = decimal * base + digit;
    }
    return decimal;
}

// 任意进制之间的转换
std::string convertBase(const std::string& num, int fromBase, int toBase) {
    int decimal = baseToDecimal(num, fromBase);
    return decimalToBase(decimal, toBase);
}

int main() {
    std::string binary = "101010";
    std::string hex = convertBase(binary, 2, 16);
    std::cout << "Binary to Hexadecimal: " << hex << std::endl; // 2A

    return 0;
}

4. 总结

  • 使用 std::bitset 可以快速将整数转换为二进制。
  • 使用 std::ostringstreamstd::setbase 可以将整数转换为任意进制。
  • 使用 std::stoi 可以将字符串从指定进制转换为十进制。
  • 手动实现进制转换可以处理更复杂的需求。

http://www.kler.cn/a/527061.html

相关文章:

  • 天融信 NGFW2.3 mibs
  • AJAX综合案例——图书管理
  • 消息队列篇--通信协议篇--TCP和UDP(3次握手和4次挥手,与Socket和webSocket的概念区别等)
  • 【股票数据API接口41】如何获取股票指最新分时MA数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • 【腾讯云】腾讯云docker搭建单机hadoop
  • ESP32-CAM实验集(WebServer)
  • 计算机网络部分知识点(王道考研笔记)
  • 第05章 15 VTK中Implicit Function的作用原理与基本应用场合
  • 本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操
  • vue插件安装后使用没反应
  • 一文读懂 Faiss:开启高维向量高效检索的大门
  • TCP UDP Service Model
  • 玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱
  • Python练习(3)
  • 计算机网络 笔记 传输层
  • flowable expression和json字符串中的双引号内容
  • DeepSeek大模型技术深度解析:揭开Transformer架构的神秘面纱
  • 4-图像梯度计算
  • Java小白入门教程:两大类型的修饰符以及示例
  • Kafka常见问题之 java.io.IOException: Disk error when trying to write to log
  • 如何本地部署DeepSeek
  • 在Ubuntu子系统中基于Nginx部署Typecho
  • 实现B-树
  • 供应链系统设计-供应链中台系统设计(十四)- 清结算中心设计篇(三)
  • PHP实现混合加密方式,提高加密的安全性(代码解密)
  • 芯片AI深度实战:进阶篇之Vim+AST实现Verilog实时语义和逻辑检查