首頁 > 軟體

C語言格式輸出二進位制的2種方法總結

2022-08-11 14:02:57

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("庫函數得到的二進位制為:%srn",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("rn");
}

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("%dn", 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語言格式輸出二進位制內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com