我正在阅读一本 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/