int abs(int number)函数有感: 求补码和通过补码求对应的整数 C++(增加:数字的二进制表示中1的个数)
#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;
}