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!
推薦閱讀:
- C/C++字節序的深入理解
- C語言中#define定義的標識符和宏實例代碼
- 解析C/C++指針、函數、結構體、共用體
- C語言庫函數中qsort()的用法
- C語言通過gets和gets_s分別實現讀取含空格的字符串