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

linchaolong 2022-06-23 05:59:00 阅读数:647

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");
}



版权声明:本文为[linchaolong]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/174/202206230421395488.html