C语言格式输出二进制的2种方法总结

 更新时间:2022年08月11日 10:15:37   作者:IT狼~  
众所周知C中以八进制,十进制和十六进制都可以通过%o,%d和%x轻松实现,然而唯独没有提供二进制输出的快速方式,下面这篇文章主要给大家介绍了关于C语言格式输出二进制的2种方法,需要的朋友可以参考下

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语言格式输出二进制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言对结构体数组按照某项规则进行排序的实现过程探究

    C语言对结构体数组按照某项规则进行排序的实现过程探究

    这篇文章主要介绍了C语言对结构体数组按照某项规则进行排序的实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • C++实现涂色游戏(博弈)

    C++实现涂色游戏(博弈)

    这篇文章主要为大家详细介绍了C++实现涂色游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C语言实现随机生成6位数密码

    C语言实现随机生成6位数密码

    这篇文章主要为大家详细介绍了如何使用C语言实现一个简单而实用的随机密码生成器,该生成器将生成包含字母、数字和特殊字符的随机密码,有需要的小伙伴可以参考下
    2023-11-11
  • C++二叉树的前序中序后序非递归实现方法详细讲解

    C++二叉树的前序中序后序非递归实现方法详细讲解

    前序遍历的顺序是根、左、右。任何一颗树都可以认为分为左路节点,左路节点的右子树。先访问左路节点,再来访问左路节点的右子树。把访问左路节点的右子树看成一个子问题,就可以完整递归访问了
    2023-03-03
  • C++ pair的用法案例详解

    C++ pair的用法案例详解

    这篇文章主要介绍了C++ pair的用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • C++删除链表中间节点的方法

    C++删除链表中间节点的方法

    这篇文章主要介绍了C++删除链表中间节点的方法,结合实例形式分析了链表删除中间节点的具体思路与实现技巧,需要的朋友可以参考下
    2017-05-05
  • C++初阶教程之缺省参数与函数重载

    C++初阶教程之缺省参数与函数重载

    缺省参数是声明或定义函数时为函数的参数指定一个缺省值,在调用该函数时如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,这篇文章主要给大家介绍了关于C++初阶之缺省参数与函数重载的相关资料,需要的朋友可以参考下
    2023-04-04
  • C语言转义字符实例详解

    C语言转义字符实例详解

    这里主要介绍了C语言的转义字符的知识,并附有示例代码,以便理解,希望对学习 C语言的同学有所帮助
    2016-07-07
  • Qt实现Slider滑块条组件的示例代码

    Qt实现Slider滑块条组件的示例代码

    在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,本文主要介绍了Qt实现Slider滑块条组件的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • c++支持coroutine的简单示例

    c++支持coroutine的简单示例

    这篇文章主要介绍了c++支持coroutine的简单示例,使用的是linux 平台做的,需要的朋友可以参考下
    2014-03-03

最新评论