目录
- 1.前言
- 2.源码实现
- 3.结果展示
- 附:C语言如何将一个数字的二进制形式输出出来
- 总结
1.前言
在我们日常的编程中,有时候需要格式化输出一个整形数据的二进制,但是在我们C语言中只有
- 输出十进制:%d;
- 输出十六进制:%x;
- 输出单个字符:%c;
- 输出字符串:%s;
- 输出变量所在的地址:%p;
而并没有这种二进制对应的格式,所以需要我们手动来实现。
2.源码实现
本篇博客给大家介绍两种方法:
1.通过库函数itoa,需要包含头文件:#include <stdlib.h>;
2.通过十进制转成二进制的常用方法——短除法;
为方便大家使用,将两种方法都封装成了函数,源码如下:
#include <stdio.h> #include <stdlib.h> #define uint32 unsigned int #define uint8 unsigned char void FuncOutputBin(uint32 value) { char string[33]; //形参类型uint32最大为32位,因此我这里定义了大小为33的字符串数组存放 itoa(value, string, 2); printf("库函数得到的二进制为:%s\r\n",string); } //用短除法的思想得到二进制,之后将数据从后往前读取 void ShortDivOutputBin(uint32 input) { uint8 temp[33] = {0}; int i = 0; printf("短除法得到的二进制为:"); while(input) { temp[i] = input % 2; //取余数存放到数组中,此为得到的二进制数 input = (uint32)input / 2; //短除,while中判断是否除尽 i++; //存储了一个二进制数,自加存储下一个 } for(i--; i>=0; i--) //由于最后一次input为0无效,i还是自加了,因此最后一次自加的值是无用的,所以先自减,然后将余数从后往前读取 { printf("%d",temp[i]); } printf("\r\n"); } void main(void) { uint32 input = 0; printf("请输入一个需要转化为2进制的整形数据:"); scanf("%d", &input); FuncOutputBin(input); ShortDivOutputBin(input); }
itoa函数原型:char *itoa( int value, char *string,int radix)
功能:将整形数据value转化成需要的进制radix,然后将之以字符串的形式存放在string中;
返回值:转化成对应进制后的字符串的地址,也可以不使用返回值;
它的三个参数依次为:
value:需要转化的整形数据;
string:转化成对应进制后的字符串的地址;
radix :需要转化的进制(我这里需要转化为2进制,所以填2);
3.结果展示
(有图有真相咯~)
附:C语言如何将一个数字的二进制形式输出出来
一. 我们知道由十进制转二进制的算法,因此可以直接计算出其二进制数
例如:对3求其二进制
int main() { int n = 3; int arr[33] = { 0 };//int 型有32个字节 int i = 0; while (n > 0) { arr[i] = n % 2; ++i; n /= 2; } int k = 0; for (k = i-1; k >= 0; k--) //逆序输出 { printf("%d", arr[k]); } return 0; }
二. 因为数字在计算机中就是以二进制的形式存储的,那我们也可以通过 位运算符 来表示出一个数的二进制。
用&(按位与)运算符,其运算原理是对其两个操作数的计算机内存储的二进制形式(补码)的对应位进行按位与,如果1&1结果是1,其他结果都是0。
例如 3&5:
int a = 3; //a: 00000000000000000000000000000011 int b = 5; //b: 00000000000000000000000000000101 int c = a & b; //c: 00000000000000000000000000000001
因此,可以让一个数n&1,然后得到n的二进制的第一位的值(如果结果是1,那n的二进制的第一位也是1,如果是0,那第一位是0),然后让n右移一位n>>1,然后找其第二位。。。。。。然后一直遍历到第32位。
int main() { int n = 5; int i = 0; int arr[33] = { 0 };//int 是有32位的 //从第一位开始依次取n对应二进制的每一位 for (i = 1; i <=sizeof(int) * 8; i++) { arr[i] = n & 1; n=n >> 1; } //printf("%d\n", i); int k = 0; //逆序输出 for (k = i-1; k >= 1; k--) { printf("%d", arr[k]); } printf("\n"); return 0; }
运算结果:
但是用数组存,有点麻烦,所以我又改进了一下
int main() { int n = 5;//0000000101 int i = 0; int k = 1 << 31; for (i = 0; i < sizeof(int) * 8; i++) { printf("%d", -((n & k) >> 31)); n <<= 1; } printf("\n"); return 0; }
但是我感觉还是有点麻烦,可又想不出更好的方案了。。。。。。
总结
到此这篇关于C语言格式输出二进制的2种方法的文章就介绍到这了,更多相关C语言格式输出二进制内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!