二进制补码算法

时间:2011-09-28 11:42:20

标签: c++ binary

我试图看看编译器如何以二进制负数写入,所以这里应该是代码

#include <cstdlib>
#include <iostream>
using namespace std;
void complement(int n)
{
    int l = n;
    int s = 0;
    int k = 0;
    int m = 0;

    while (n != 0)
    {
        s = n  %  2;
        n /= 2;
        cout << s << "  ";
    }

    cout << endl;
    m = ~l + 1;
    cout << m << endl;
    cout << endl;

    while (m != 0)
    {
        int k = m  %  2;
        m /= 2;
        cout << k << "  ";
    }
}

int main(int argc, char *argv[])
{
    int n;
    cin >> n;
    cout << endl;
    complement(n);
    system("PAUSE");
    return EXIT_SUCCESS;
}

但奇怪的是,当我输入5时,例如,显然是二进制形式的是3位中的101,其补码-5表示为-10-1?这是我的代码输出显示给我的,但我知道这是不正确的,因为任何数字的2的补码是通过反转其位,0乘1反之亦然,然后+1,在5的情况下给出(101 ),-5将是(010 + 1)=(011)。请帮助我,如何纠正我的代码,以便它可以正确补充。

2 个答案:

答案 0 :(得分:1)

如果你想看到数字位,你最好使用这样的结构:

int main(int argc, _TCHAR* argv[])
{
    int i = -10; //my value
    std::string result;
    for (int bit = 0; bit < sizeof(int)*8; ++bit)
    {
       int bit_val = 1 & i;
       result = (bit_val ? "1" : "0") + result;
       i = i >> 1;
    }
    std::cout << result << std::endl;
}

答案 1 :(得分:1)

在C ++中查看位的最简单方法是使用 std::bitset 。它支持iostream输出和转换为/从字符串转换。像这样:

#include <stdio.h>      // printf
#include <limits.h>     // CHAR_BIT
#include <bitset>

int main()
{
    int const bitsPerByte   = CHAR_BIT;
    int const bitsPerInt    = sizeof( int )*bitsPerByte;
    int const m             = -10;
    std::bitset<bitsPerInt>     bits( m );

    printf(
        "%d in decimal is %s in %d-bits binary.\n",
        m,
        bits.to_string().c_str(),
        bitsPerInt
        );
}

输出:

  十进制的

-10是32位二进制的11111111111111111111111111110110。