C和C++的二进制,八进制,十六进制输出格式(全面版)

1 十进制 输出 二八十六进制

一般大家默认二进制,八进制,十进制,十六进制分别用字符:bin, oct, dec, hex 来表示;

1.1 十进制 输出 十六进制

C++ 版本->   cout <<"十六进制:"<< hex <<num<<endl;
C   版本->   printf("十六进制:%#x\n",i);//%x十六进制输出格式,%#x 输出带上0x

ps1: C版本 %x会直接输出16进制数,%#x 的输出会带上0x的标志,如果’X’是大写,则带的标志也是大写0X。

1.2 十进制 输出 八进制

C++ 版本->  cout <<"八进制:"<< oct <<num<<endl;
C   版本->  printf("八进制:%o\n",i);//%o八进制输出格式,%#o 输出带上0,很像0

1.3 十进制 输出 二进制

C或者C++的printf,cout可以实现直接输出八进制,十进制,十六进制数据,但是不支持直接的二进制输出,需要调用其它库函数。

其中C语言版本借助<stdlib.h>的itoa函数,调用方式: itoa(num, s, 2)。num:要转成二进制的数;s:提前定义好的char类型数组;2:二进制基数。

C++版本借助库,调用方式bitset(num),其中 len: 二进制输出的位数,提前自定义; num:要转成二进制的数。

C++ 版本->  cout <<"二进制:"<<bitset<10>(num) <<endl; //10是二进制位数,自定义为多少输出就是多少位,高位补0
C  版本-> char s[10]; //自定义二进制数的位数,输出位数是实际所需位数
		  itoa(num,s,2);//转成字符串,基数为2             
		  printf("二进制:%s\n",s);

1.4 代码实例

void test1() {
	char s[10]; //自定义二进制数的位数,输出位数是实际所需位数
	for (int num = 99; num < 102; num++) {
		//C++版本
		printf("--------------------number(dec):%d\n", num);
		cout << "----C++----" << endl;
		cout <<"十进制:"<< dec <<num<<endl;
		cout << "十六进制:" << hex << num << endl;
		cout << "八进制:" << oct << num << endl;
		cout << "二进制:" << bitset<10>(num) << endl;//10是二进制位数,自定义为多少输出就是多少位,高位补0
		cout << "----C----" << endl;

		//C语言版本 
		printf("十进制:%d\n",num); 
		printf("十六进制:%#x\n", num); //%x十六进制输出格式,%#x 输出带上0x
		printf("八进制:%o\n", num);  //%o八进制输出格式,%#o 输出带上0,很像0
		itoa(num, s, 2);//转成字符串,基数为2   //在VS运行出错,改为_itoa_s(sum,s,2);
		printf("二进制:%s\n", s);
	}
}

输出:

--------------------number(dec)99
----C++----
十六进制:63
八进制:143
二进制:0001100011
----C----
十六进制:0x63
八进制:143
二进制:1100011
--------------------number(dec)100
----C++----
十六进制:64
八进制:144
二进制:0001100100
----C----
十六进制:0x64
八进制:144
二进制:1100100
--------------------number(dec)101
----C++----
十六进制:65
八进制:145
二进制:0001100101
----C----
十六进制:0x65
八进制:145
二进制:1100101
 

关于itoa(num, s, 2);这个转二进制的函数
在vs2022,VS2019里报错,不安全,使用_itoa()函数替代itoa
在这里插入图片描述
根据提示使用_itoa()函数
_itoa(sum,s,2);
在这里插入图片描述
结果还是报错,提示使用_itoa_s替代
或者To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

解决方法1:使用_itoa_s替代_itoa

void test2() {
	char s[10];
	int sum = 99;
	_itoa_s(sum,s,2);
	printf("二进制:%s",s);
}

在这里插入图片描述
解决方法2:添加宏定义 _CRT_SECURE_NO_WARNINGS

#define _CRT_SECURE_NO_WARNINGS
void test2() {
	char s[10];
	int sum = 99;
	_itoa(sum,s,2);
	printf("二进制:%s",s);
}

结果还是相同错误
在这里插入图片描述

2 十进制转二进制

在这里插入图片描述

2.1 C++

string DecToBinary(int n)
{
	string r;
	while (n != 0) {
		r += (n % 2 == 0 ? "0" : "1");
		n /= 2;
	}//此时r是  地位在前高位在后,逆置才是二进制正确值
	reverse(r.begin(), r.end());//#include<algorithm>
	return r;
}

在这里插入图片描述

2.2 c语言

#define MAX 10//二进制最大长度
void DecToBinary2(int n) {
	char binary[MAX];
	int i = 0;
	while (n) {
		binary[i++] = (n % 2 == 0 ? 0 : 1);
		n /= 2;
	}
	for (int k = i - 1; k >= 0; k--)
		printf("%d",binary[k]);
}

在这里插入图片描述
封装

#define MAX 10//二进制最大长度
void DecToBinary3(int n, char binary[MAX], int &len) {
	int i = 0;
	while (n) {
		binary[i++] = (n % 2 == 0 ? 0 : 1);
		n /= 2;	
	}
	len = i;
	for (int j = 0; j < len/2; j++)
		swap(binary[j] ,binary[len - 1 -j]);
	//for (int i = 0; i < len; i++)
	//	printf("%d", binary[i]);//注意,这里输出格式是%d,虽然是char数组,但存储的是int 
}
void swap(char* a, char* b) {
	char tmp;
	tmp = *a;
	*a = *b;
	*b = tmp;
}
int main() {
	char binary[MAX];
	int len;
	DecToBinary3(101, binary, len);
	for (int i = 0; i < len; i++)
		printf("%d", binary[i]);//注意,这里输出格式是%d,虽然是char数组,但存储的是int 
	return 0;
}

3 十进制 转 二八十六进制 通用函数

3.1 C++实现

//十进制 转 二八十六进制 通用函数
//c++ 
string DecToAny2(int n, int radix)
{ 
	char ch[17] = "0123456789ABCDEF";
	string r;
	while (n != 0) {
		r += ch[n % radix];
		n /= radix;
	}//此时r是  地位在前高位在后,逆置才是二进制正确值
	reverse(r.begin(), r.end());//#include<algorithm>
	return r;
}
int main() {
	string number = DecToAny2(101, 16);
	cout << number << endl;
	return 0;
}

在这里插入图片描述

string number = DecToAny2(101, 2);
输出:1100101
string number = DecToAny2(101, 8);
输出:145
string number = DecToAny2(101, 16);
输出:65
string number = DecToAny2(30, 16);
输出:1E

3.2 C实现

void swap(char* a, char* b) {
	char tmp;
	tmp = *a;   *a = *b;  *b = tmp;
}
// 十进制 转 二八十六进制 通用函数 
//C语言
void DecToAny(int n, char number[MAX], int radix, int& len) {
	char ch[17] = "0123456789ABCDEF";
	int i = 0;
	while (n) {
		number[i++] = ch[n % radix];
		n /= radix;
	}
	len = i;
	for (int j = 0; j < len / 2; j++)
		swap(number[j], number[len - 1 - j]);
	//for (int i = 0; i < len; i++)
	//	printf("%c", number[i]);
}
int main() {
	char number[MAX];
	int len;
	DecToAny(30, number,16, len);
	for (int i = 0; i < len; i++)
		printf("%c", number[i]);
	return 0;
}

在这里插入图片描述

DecToAny(101, number,2, len);
输出:1100101
DecToAny(101, number,8, len);
输出:145
DecToAny(101, number,16, len);
输出:65
DecToAny(30, number,16, len);
输出:1E

4 二八十六 转 十进制 通用函数

// 二八十六进制  十进制 通用函数 
int anyToDec(string str,int radix) {
	int sum = 0;
	for (int i = 0; i < str.size(); i ++)
		if(str[i])
		     sum += (str[i] - '0') * pow(radix, str.size() - i - 1);
	return sum;
}
int main() {
	int n = anyToDec("65", 16);
	cout << n << endl;
	return 0;
}

在这里插入图片描述

int n = anyToDec("10011", 2);
输出:19
int n = anyToDec("145", 8);
输出:101
int n = anyToDec("65", 16);
输出:101
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐