我没有得到我期望使用Bitwise NOT运算符的答案。会感激一些帮助

时间:2011-09-04 19:34:01

标签: c++ bit-manipulation

我正在努力学习一些C ++书籍。我被困在一件事上,没有。我理解它会翻转所有的内容,但它在C ++中的表现并不合适。这是相关代码。

letter = 'A';  // dec = 65   hex = 0x41   binary = 0100 0001
cout << endl << "Bitwise NOT" << endl;
cout << "Letter: " << letter << " = " << insertSpaces(toBinary(letter)) << endl;
int notletter = ~letter;
cout << "~Letter: " << notletter << endl;


string insertSpaces(string binary)
// insert spaces into a binary number string for readability
{
    int pos = 4;
    int len = binary.length();

    while (pos < len)
    {
        binary.insert(pos, " ");
        pos = pos + 5;   // 5 because it includes space
        len++;           // space makes length longer
    }
    return binary;
}

string toBinary(int letter)
{
    string result = "";
    while (letter > 0)
    {
        result = toString(letter % 2) + result;
        letter /= 2;
    }
    int rem = result.length() % 4;
    if (rem > 0)
    {
        int zeros = 4 - rem;
        for (int i = 0; i < zeros; i++)
            result = "0" + result;
    }
    return result;
}

这是输出。

Bitwise NOT
Letter: A = 0100 0001
~Letter: -66

答案应该是二进制190或1011 1110,为什么我得到-66? 我正在使用Visual C ++ 2010。

2 个答案:

答案 0 :(得分:5)

使用无符号整数而不是有符号整数。您得到负数的原因是因为今天大多数计算机都使用two's complement

这就是你的数据在按位之前和之后的样子:

before     | after
0100 0001  | 1011 1110

(实际上可能有32位,因为你使用的是int而不是char;这里使用的最佳类型可能是uint8_t

在二进制补码中,如果最高有效位为1,则数字为负。在不是之后,它是。在两个人的赞美中,为了否定一个数字,你不按位并加1。如果你取1011 1110并反转它,你得到0100 0001。现在添加一个,结果为0100 0010。如果你将它转换为十进制,你得到66.添加减号,因为第一位是1,你得到-66,意外的值。

答案 1 :(得分:0)

您正在Two's Complement处理已签名的号码。该值已超过最大正值(127)并包裹在负空间中。

您可以将其打印为无符号字符/整数(即(unsigned int)notletterstatic_cast<unsigned int>(notletter))。