C語言格式輸出二進(jìn)制的2種方法總結(jié)
1.前言
在我們?nèi)粘5木幊讨校袝r(shí)候需要格式化輸出一個(gè)整形數(shù)據(jù)的二進(jìn)制,但是在我們C語言中只有
- 輸出十進(jìn)制:%d;
- 輸出十六進(jìn)制:%x;
- 輸出單個(gè)字符:%c;
- 輸出字符串:%s;
- 輸出變量所在的地址:%p;
而并沒有這種二進(jìn)制對應(yīng)的格式,所以需要我們手動來實(shí)現(xiàn)。
2.源碼實(shí)現(xiàn)
本篇博客給大家介紹兩種方法:
1.通過庫函數(shù)itoa,需要包含頭文件:#include <stdlib.h>;
2.通過十進(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]; //形參類型uint32最大為32位,因此我這里定義了大小為33的字符串?dāng)?shù)組存放 itoa(value, string, 2); printf("庫函數(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++; //存儲了一個(gè)二進(jìn)制數(shù),自加存儲下一個(gè) } for(i--; i>=0; i--) //由于最后一次input為0無效,i還是自加了,因此最后一次自加的值是無用的,所以先自減,然后將余數(shù)從后往前讀取 { printf("%d",temp[i]); } printf("\r\n"); } void main(void) { uint32 input = 0; printf("請輸入一個(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)化成對應(yīng)進(jìn)制后的字符串的地址,也可以不使用返回值;
它的三個(gè)參數(shù)依次為:
value:需要轉(zhuǎn)化的整形數(shù)據(jù);
string:轉(zhuǎn)化成對應(yīng)進(jìn)制后的字符串的地址;
radix :需要轉(zhuǎn)化的進(jìn)制(我這里需要轉(zhuǎn)化為2進(jìn)制,所以填2);
3.結(jié)果展示
(有圖有真相咯~)
附:C語言如何將一個(gè)數(shù)字的二進(jìn)制形式輸出出來
一. 我們知道由十進(jìn)制轉(zhuǎn)二進(jìn)制的算法,因此可以直接計(jì)算出其二進(jìn)制數(shù)
例如:對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)制的形式存儲的,那我們也可以通過 位運(yùn)算符 來表示出一個(gè)數(shù)的二進(jìn)制。
用&(按位與)運(yùn)算符,其運(yùn)算原理是對其兩個(gè)操作數(shù)的計(jì)算機(jī)內(nèi)存儲的二進(jìn)制形式(補(bǔ)碼)的對應(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位的 //從第一位開始依次取n對應(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; }
但是我感覺還是有點(diǎn)麻煩,可又想不出更好的方案了。。。。。。
總結(jié)
到此這篇關(guān)于C語言格式輸出二進(jìn)制的2種方法的文章就介紹到這了,更多相關(guān)C語言格式輸出二進(jìn)制內(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í)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12C++ DLL實(shí)現(xiàn)循環(huán)播放音樂的示例詳解
這篇文章主要為大家詳細(xì)介紹了C++ DLL實(shí)現(xiàn)循環(huán)播放音樂的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2024-03-03C語言簡單實(shí)現(xiàn)求n階勒讓德多項(xiàng)式的方法
這篇文章主要介紹了C語言簡單實(shí)現(xiàn)求n階勒讓德多項(xiàng)式的方法,涉及C語言復(fù)雜浮點(diǎn)數(shù)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05