1. 程式人生 > >int abs(int number)函式有感: 求補碼和通過補碼求對應的整數 C++(增加:數字的二進位制表示中1的個數)

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