位操作,主要是〜

时间:2012-11-06 08:18:37

标签: c++

我目前正在将十进制转换为二进制,确保它是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;
}

2 个答案:

答案 0 :(得分:2)

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

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

(你期待什么结果?)

答案 1 :(得分:0)

您正在使用unsigned int进行操作,因为从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。