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語言格式輸出二進制內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: