c++ - 我没有得到我期望使用按位非运算符的答案。会很感激一些帮助

标签 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。

最佳答案

使用无符号整数而不是有符号整数。你得到负数的原因是因为今天大多数计算机使用 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,即意外值。

关于c++ - 我没有得到我期望使用按位非运算符的答案。会很感激一些帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7301646/

相关文章:

c++ - 处理和触发从 QML 到 C++ 的事件,反之亦然

java - 在 int 类型中设置 4 位半字节

javascript - 需要一种有效且正确的方法来清除 Javascript 中不确定是 1 还是 0 的位

c# - 用于检查数字负性的右移运算符

c - 如果 x <= y,只使用按位运算符创建一个返回 1 的函数

c++ - 当用户选择一个项目时 QListWidget 移动

c++ - 在绘制循环中绘制 Sprite

c++ - 我应该在将堆分配的字符串发送到 std::string 后删除它吗?

c++ - 为什么 C++11 删除的函数参与重载决策?

c++ - 如何有效地扫描 2 位掩码交替每次迭代