int abs(int number)函式有感: 求補碼和通過補碼求對應的整數 C++(增加:數字的二進位制表示中1的個數)
阿新 • • 發佈:2019-01-04
#include "limits.h"
#include "math.h"
int abs(int number)
{
int const mask = number >> (sizeof(int) * CHAR_BIT - 1);
return (number + mask) ^ mask;
}
這是一個求絕對值的函式,看了它不禁想起負數在計算機中的構成.
負數在計算機中是按補碼儲存的,如何給定一個int型數,輸出它的補碼呢?以及給一個數的補碼,如何求出這個數呢?(假設是32位的系統)
下面是我寫的兩個函式,分別是①將數字轉換成二進位制補碼形式,以字串形式輸出 ②以二進位制補碼的字串輸入,輸出二進位制補碼對應的整數
#include <iostream>
#include <string>
using namespace std;
string toBinary(int x)
{
string result;
short int i;
char a[33];
a[32]='\0';
for (i=0;i<32;i++)
{ if ( (x & 1<<(31-i) )==0 )
result += '0';
else
result += '1';
}
return result;
}
int toDec(string binary)
{
int result = 0;
int flag = 1;
for (int i = binary.size()-1; i>0; --i)
{
if (binary[0] == '0')
{
result += (binary[i]-'0') * flag;
}
else
{
result += !(binary[i]-'0') * flag;
}
flag *= 2 ;
}
if (binary[0] == '1')
{
result += 1;
result = -result;
}
return result;
}
int main()
{
int num;
cout << "請輸入一個整數(可以是負數): ";
cin >> num;
string binary = toBinary(num);
cout << num << "的補碼是: " << binary << endl;
int dec = toDec(binary);
cout << "補碼"<< binary << "對應的整數為:" << dec << endl;
}
增加一個求數字二進位制表示中1的個數(同樣適用於負數,即補碼中1的個數)
int NumberOf1(int n) {
int count = 0;
while (n)
{
count++;
n = n & (n-1);
}
return count;
}