C語(yǔ)言格式輸出二進(jìn)制的2種方法總結(jié)
1.前言
在我們?nèi)粘5木幊讨?,有時(shí)候需要格式化輸出一個(gè)整形數(shù)據(jù)的二進(jìn)制,但是在我們C語(yǔ)言中只有
- 輸出十進(jìn)制:%d;
- 輸出十六進(jìn)制:%x;
- 輸出單個(gè)字符:%c;
- 輸出字符串:%s;
- 輸出變量所在的地址:%p;
而并沒(méi)有這種二進(jìn)制對(duì)應(yīng)的格式,所以需要我們手動(dòng)來(lái)實(shí)現(xiàn)。
2.源碼實(shí)現(xiàn)
本篇博客給大家介紹兩種方法:
1.通過(guò)庫(kù)函數(shù)itoa,需要包含頭文件:#include <stdlib.h>;
2.通過(guò)十進(jìn)制轉(zhuǎn)成二進(jìn)制的常用方法——短除法;
為方便大家使用,將兩種方法都封裝成了函數(shù),源碼如下:
#include <stdio.h>
#include <stdlib.h>
#define uint32 unsigned int
#define uint8 unsigned char
void FuncOutputBin(uint32 value)
{
char string[33]; //形參類(lèi)型uint32最大為32位,因此我這里定義了大小為33的字符串?dāng)?shù)組存放
itoa(value, string, 2);
printf("庫(kù)函數(shù)得到的二進(jìn)制為:%s\r\n",string);
}
//用短除法的思想得到二進(jìn)制,之后將數(shù)據(jù)從后往前讀取
void ShortDivOutputBin(uint32 input)
{
uint8 temp[33] = {0};
int i = 0;
printf("短除法得到的二進(jìn)制為:");
while(input)
{
temp[i] = input % 2; //取余數(shù)存放到數(shù)組中,此為得到的二進(jìn)制數(shù)
input = (uint32)input / 2; //短除,while中判斷是否除盡
i++; //存儲(chǔ)了一個(gè)二進(jìn)制數(shù),自加存儲(chǔ)下一個(gè)
}
for(i--; i>=0; i--) //由于最后一次input為0無(wú)效,i還是自加了,因此最后一次自加的值是無(wú)用的,所以先自減,然后將余數(shù)從后往前讀取
{
printf("%d",temp[i]);
}
printf("\r\n");
}
void main(void)
{
uint32 input = 0;
printf("請(qǐng)輸入一個(gè)需要轉(zhuǎn)化為2進(jìn)制的整形數(shù)據(jù):");
scanf("%d", &input);
FuncOutputBin(input);
ShortDivOutputBin(input);
}
itoa函數(shù)原型:char *itoa( int value, char *string,int radix)
功能:將整形數(shù)據(jù)value轉(zhuǎn)化成需要的進(jìn)制radix,然后將之以字符串的形式存放在string中;
返回值:轉(zhuǎn)化成對(duì)應(yīng)進(jìn)制后的字符串的地址,也可以不使用返回值;
它的三個(gè)參數(shù)依次為:
value:需要轉(zhuǎn)化的整形數(shù)據(jù);
string:轉(zhuǎn)化成對(duì)應(yīng)進(jìn)制后的字符串的地址;
radix :需要轉(zhuǎn)化的進(jìn)制(我這里需要轉(zhuǎn)化為2進(jìn)制,所以填2);
3.結(jié)果展示
(有圖有真相咯~)

附:C語(yǔ)言如何將一個(gè)數(shù)字的二進(jìn)制形式輸出出來(lái)
一. 我們知道由十進(jìn)制轉(zhuǎn)二進(jìn)制的算法,因此可以直接計(jì)算出其二進(jìn)制數(shù)
例如:對(duì)3求其二進(jìn)制

int main()
{
int n = 3;
int arr[33] = { 0 };//int 型有32個(gè)字節(jié)
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;
}二. 因?yàn)閿?shù)字在計(jì)算機(jī)中就是以二進(jìn)制的形式存儲(chǔ)的,那我們也可以通過(guò) 位運(yùn)算符 來(lái)表示出一個(gè)數(shù)的二進(jìn)制。
用&(按位與)運(yùn)算符,其運(yùn)算原理是對(duì)其兩個(gè)操作數(shù)的計(jì)算機(jī)內(nèi)存儲(chǔ)的二進(jìn)制形式(補(bǔ)碼)的對(duì)應(yīng)位進(jìn)行按位與,如果1&1結(jié)果是1,其他結(jié)果都是0。
例如 3&5:
int a = 3; //a: 00000000000000000000000000000011 int b = 5; //b: 00000000000000000000000000000101 int c = a & b; //c: 00000000000000000000000000000001
因此,可以讓一個(gè)數(shù)n&1,然后得到n的二進(jìn)制的第一位的值(如果結(jié)果是1,那n的二進(jìn)制的第一位也是1,如果是0,那第一位是0),然后讓n右移一位n>>1,然后找其第二位。。。。。。然后一直遍歷到第32位。
int main()
{
int n = 5;
int i = 0;
int arr[33] = { 0 };//int 是有32位的
//從第一位開(kāi)始依次取n對(duì)應(yīng)二進(jì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;
}運(yùn)算結(jié)果:

但是用數(shù)組存,有點(diǎn)麻煩,所以我又改進(jìn)了一下
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;
}但是我感覺(jué)還是有點(diǎn)麻煩,可又想不出更好的方案了。。。。。。
總結(jié)
到此這篇關(guān)于C語(yǔ)言格式輸出二進(jìn)制的2種方法的文章就介紹到這了,更多相關(guān)C語(yǔ)言格式輸出二進(jìn)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VS2017開(kāi)發(fā)C語(yǔ)言出現(xiàn)“no_init_all“的解決辦法
這篇文章介紹了VS2017開(kāi)發(fā)C語(yǔ)言出現(xiàn)“no_init_all“的解決辦法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
C++ DLL實(shí)現(xiàn)循環(huán)播放音樂(lè)的示例詳解
這篇文章主要為大家詳細(xì)介紹了C++ DLL實(shí)現(xiàn)循環(huán)播放音樂(lè)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2024-03-03
C語(yǔ)言 CRITICAL_SECTION用法案例詳解
這篇文章主要介紹了C語(yǔ)言 CRITICAL_SECTION用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)求n階勒讓德多項(xiàng)式的方法
這篇文章主要介紹了C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)求n階勒讓德多項(xiàng)式的方法,涉及C語(yǔ)言復(fù)雜浮點(diǎn)數(shù)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05

