1

我目前正在将十进制转换为二进制,确保它是 8 位。除 ~ (NOT) 操作外,所有位操作均有效。它们以巨大的整数值出现。我不知道为什么,因为其他位操作有效。这是我的代码:(注释掉的行是不起作用的)

编辑:如果我想获得 8 位二进制字符串,我该怎么办?使用无符号字符?如果我将所有无符号整数更改为无符号字符,那么我的 BinaryToDecimal 函数会产生不正确的二进制转换。

#include <iostream>
#include <string>

using namespace std;

string BinaryToDecimal(unsigned int dec)
{
    string binary   = "";
    float remainder = 0.0f;

    while( dec != 0 )
    {
        remainder = dec % 2;
        dec      /= 2;

        if( remainder == 0 )
            binary.append("0");
        else
            binary.append("1");
    }


    // Reverse binary string
    string ret = string(binary.rbegin(), binary.rend());

    return ret;
}

int main()
{
    unsigned int a = 0;
    unsigned int b = 0;

    cout << "Enter a number to convert to binary: ";
    cin  >> a;
    cout << "Enter a number to convert to binary: ";
    cin  >> b;

    cout << "A = " << BinaryToDecimal(a) << endl;
    cout << "B = " << BinaryToDecimal(b) << endl;

    unsigned int c = a & b;
    unsigned int d = a | b;
    //unsigned int e = ~a;
    //unsigned int f = ~b;
    unsigned int g = a ^ b;
    unsigned int h = a << 2;
    unsigned int i = b >> 3;

    cout << "A & B  = " << BinaryToDecimal(c) << endl;
    cout << "A | B  = " << BinaryToDecimal(d) << endl;
    //cout << "~A     = " << BinaryToDecimal(e) << endl;
    //cout << "~B     = " << BinaryToDecimal(f) << endl;
    cout << "A ^ B  = " << BinaryToDecimal(g) << endl;
    cout << "A << 2 = " << BinaryToDecimal(h) << endl;
    cout << "B >> 3 = " << BinaryToDecimal(i) << endl;
}
4

2 回答 2

2

如果您对一个小的无符号整数执行二进制 NOT,您将得到一个大数字,因为大多数最高有效位将被设置为 1(它们在操作数中的倒数)。

在这种情况下,您所做~ 0的肯定会给您一个很大的数字,实际上是最大可能的无符号整数,因为所有位都将设置为 1。

(你期待什么结果?)

于 2012-11-06T08:21:20.797 回答
0

您正在使用unsigned intfor 操作,因为从 MSB 开始的前导 1,所以小数的反转变成了大数。如果您只希望表示仅为 8 位,则应使用unsigned char它的存储。
但是您不能将 a 或 b 更改为unsigned char。否则,cin >> a会将数字的 ASCII 码放入a,而不是数字。例如,您的输入是 5,它输入 0x35('5'),而不是数字 5。

如果你不想改变unsigned int你的代码,你可以做一些小的改进

string BinaryToDecimal(unsigned int dec)
{
    string binary   = "";
    float remainder = 0.0f;

    dec &= 0xff;        // only 8 bits you care about
    while( dec != 0 )
    {
        ....

但是您正在使用while( dec !=0 ),这是错误的。如果结果已经为 0,则该函数返回一个空字符串,而不是“0000”。相反,您应该使用计数器仅计数 8 位。

    for (int i = 0; i < 8; i++ ) {
        if ((dec & 1) != 0)
            binary.append("1");
        else
            binary.append("0");
        dec >>= 1;
    }

此外,使用逐位AND测试位是 0 还是 1,并且移位操作优于 / 和 % 运算符。

最后,对于 8 位 5 (0000_0101),它的反转是 250 (1111_1010),而不是 1010。

于 2012-11-06T09:03:58.450 回答