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

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

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

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

