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