【006】深入了解C++中的进制转换:二进制、八进制、十进制、十六进制

引言


💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。
👉
🎖️ CSDN实力新星,社区专家博主
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu


🔔 上一篇:【005】C++数据类型之实型(浮点数)、有符号数以及无符号数
🔔 下一篇:【007】C++数据类型之原码、补码、反码

一、进制的概述

  • 二进制:0~1,以0b开头,bitset<8>输出。
  • 八进制:0~7,以0开头,oct输出。
  • 十进制:0~9,以数字开头,cout默认输出十进制。
  • 十六进制:0 ~ 9和A ~ F,以0x开头,hex输出,不区分正负。
  • n进制:0~n-1。

二、十进制转二进制、八进制、十六进制(短除法)

在这里插入图片描述
示例1:123转二进制,得0b0111 1011。
示例2:123转八进制,得0173。
示例3:123转十六进制,得0x7B。

通用算法:

void DecimalToOtherNumbers(int num,int other, char b[], int maxlen)
{
	memset(b, 0, maxlen);
	int n = num;
	if (num < 0)
		n = 0 - num;
	if (maxlen <= 0)
		return;
	int sum = n / other;
	int len = 0;
	while (sum != 0)
	{
		if (len >= maxlen)
			break;
		if (n % other>10)
		{
			b[len] = n % other + 'A'-10;
		}
		else
			b[len] = n % other + '0';
		n /= other;
		sum = n / other;
		len++;
	}
	b[len] = n % other + '0';

	// 现在是倒序的,需要对调位置,使其符合阅读习惯
	int idx = 0;
	while (idx < len)
	{
		int tmp = b[idx];
		b[idx] = b[len];
		b[len] = tmp;
		idx++;
		len--;
	}
}

三、二进制、八进制、十六进制转十进制(位次幂)

转换公式:
在这里插入图片描述
示例1:二进制0b11000011转为二进制, 1 × 2 7 + 1 × 2 6 + 0 × 2 5 + 0 × 2 4 + 0 × 2 3 + 0 × 2 2 + 1 × 2 1 + 1 × 2 0 = 195 1 \times 2^7+1 \times 2^6+0 \times 2^5+0 \times 2^4+0 \times 2^3+0 \times 2^2+1 \times 2^1+1 \times 2^0 = 195 1×27+1×26+0×25+0×24+0×23+0×22+1×21+1×20=195

示例2:将八进制数0123转换为十进制, 1 × 8 2 + 2 × 8 1 + 3 × 8 0 = 83 1\times8^2+2\times8^1+3\times8^0=83 1×82+2×81+3×80=83

示例3:将十六进制0x12转为十进制, 1 × 1 6 1 + 2 × 1 6 0 = 18 1\times16^1+2\times16^0=18 1×161+2×160=18

四、其他进制间的转换

4.1、二进制转八进制

从右往左,每3位二进制对应1位八进制。

1101 1010
11 011 010
3 3 2

所以二进制1101 1010转八进制就是0332。

4.2、二进制转十六进制

从右往左,每4位二进制对应1位十六进制。

1101 1010
D ----- A

所以二进制1101 1010转十六进制就是0xDA。

4.3、八进制转二进制

一位八进制对应三位二进制。

0123
001 010 011
0101 0011

所以八进制0123的二进制就是0101 0011。

4.4、十六进制转二进制

一位十六进制对应四位二进制。

0x123
0001 0010 0011

所以十六进制0x123的二进制就是0001 0010 0011。

4.5、八进制转十六进制

八进制先转为二进制,再从二进制转为十六进制。没有直接方式。

八进制 --> 二进制 --> 十六进制
0123 --> 0101 0011 --> 0x53

4.6、十六进制转八进制

十六进制先转为二进制,再从二进制转为八进制。没有直接方式。

十六进制 --> 二进制 --> 八进制
0x12 --> 0001 0010 --> 022

4.7、注意

不同进制仅仅是数据的不同表现形式而已。
示例:

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
	int num=100;
	cout<<"num的二进制:"<<bitset<8>(num)<<endl;
	cout<<"num的八进制:"<<oct<<num<<endl;
	cout<<"num的十进制:"<<dec<<num<<endl;
	cout<<"num的十六进制:"<<hex<<num<<endl;
	return 0;
}

输出:
在这里插入图片描述

总结

C++ 中常见的数字进制有十进制、二进制、八进制、十六进制。

从十进制转换到其他进制:

  • 二进制:使用除以 2 取余数的方法,将得到的余数倒序排列即为二进制。
  • 八进制:使用除以 8 取余数的方法,将得到的余数倒序排列即为八进制。
  • 十六进制:使用除以 16 取余数的方法,将得到的余数转换为对应的字母或数字,倒序排列即为十六进制。

从其他进制转换到十进制:

  • 二进制:将每一位数乘以对应的权重(2 的 n 次方),再将结果相加即可得到十进制。
  • 八进制:将每一位数乘以对应的权重(8 的 n 次方),再将结果相加即可得到十进制。
  • 十六进制:将每一位数转换为对应的十进制数,乘以对应的权重(16 的 n 次方),再将结果相加即可得到十进制。

从一个进制转换到另一个进制:先将原数转换为十进制,再将十进制转换为目标进制。

例如,将十进制数 42 转换为二进制:
42 / 2 = 21 … 0
21 / 2 = 10 … 1
10 / 2 = 5 … 0
5 / 2 = 2 … 1
2 / 2 = 1 … 0
1 / 2 = 0 … 1
得到的余数倒序排列即为二进制数 101010。
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion Long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值