1. 程式人生 > >【C/C++】獲取整數的二進位制形式字串

【C/C++】獲取整數的二進位制形式字串

思路

使用迴圈使整數左移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");
}