我正在努力学习一些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。
答案 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)notletter
或static_cast<unsigned int>(notletter)
)。