【C/C++】獲取整數的二進位制形式字串
阿新 • • 發佈:2019-02-04
思路
使用迴圈使整數左移i位,並取最高位,如果當前最高位為1則值為'1',否則為'0'。這樣拼接出一個字串。
注意:計算機中儲存的是數字的補碼。
關於正、負數的原碼、反碼、補碼。
正數:原碼、反碼、補碼都一樣。
負數:反碼(除了最高位,其它位取反)補碼(反碼+1)
為什麼要儲存補碼,而不是原碼?
為了統一運算方法。使用補碼對有符號整數進行加、減不需要關心符號位。
例如:1 + (-2) = -1
-2的原碼
1000 0000 0000 0000 0000 0000 0000 0010
-2的反碼
1111 1111 1111 1111 1111 1111 1111 1101
-2的補碼
1111 1111 1111 1111 1111 1111 1111 1110
計算過程:
0000 0000 0000 0000 0000 0000 0000 0001
+ 1111 1111 1111 1111 1111 1111 1111 1110
= 1111 1111 1111 1111 1111 1111 1111 1111
-1的補碼:1111 1111 1111 1111 1111 1111 1111 1111
如果使用原碼:1.判斷數字的符號位。2.取被加/減數的絕對值 3.加上/減去絕對值
程式碼
#include #include const int INT_SIZE = sizeof(int)*8; // int型別整數的位數 const int MAX_HEIGHT_FLAG = 1 << (INT_SIZE - 1); // 用於取最高位 // 取一個整數的二進位制形式字串,引數一為該整數,引數二為字串陣列首地址 void Int2Binary(int num, char* str){ // 如果是負數,需要先求出原碼 if (num<0) { // 計算機中儲存的是數字的補碼(取反+1) num = ~(num - 1 ); //求原碼(-1,取反) num |= MAX_HEIGHT_FLAG; //負數最高位為1 } // 每次迴圈使數字左移i位,並取最高位 char val = 0; for (int i=1; i<=INT_SIZE; ++i) { val = MAX_HEIGHT_FLAG&num << (i-1) ? '1' : '0'; //左移並取最高位,如果當前最高位為1則val值為'1',否則為'0' str[i-1] = val; printf("%c", val); if (i%4==0) { printf(" "); } } str[INT_SIZE] = 0; //結束符 printf("\n"); } // 輸入任意位數int整數,列印記憶體的二進位制儲存。 void main(){ int num = 0; while (1){ scanf_s("%d", &num); char str[INT_SIZE + 1]; Int2Binary(num, str); printf("num=%d binary=%s \n", num, str); } system("pause"); }