我没有得到我期望使用Bitwise NOT运算符的答案。希望能得到一些帮助
我正在努力学习一些C++书籍。我被困在一件事上,没有按比例。我知道它翻转所有的位,但它不符合我在C++中的预期。这是相关的代码。我没有得到我期望使用Bitwise NOT运算符的答案。希望能得到一些帮助
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,意外值。
请注意,结果会比他期望的'190'大_much_,除非他的平台具有8位'int'(这是不可能的AFAIK) – Mat
您正在处理Two's Complement中的签名号码。该值已超过最大正值(127)并包裹到负值空间。
可以将其打印为无符号字符/整数(即,(unsigned int)notletter
或static_cast<unsigned int>(notletter)
)。
几乎相同的困惑,在http://stackoverflow.com/questions/7274753/bitwise-complement-operator – AnT
我根本不做C++所以我不能告诉你具体如何解决它,但10111110 = -66如果您的字符已签名,则为190,如果不是。 – aehiilrs