我无法使用按位not运算符得到预期的答案。谢谢你的帮助 我正在努力学习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; }
答案应该是190或1011110二进制,那么为什么我得到-66呢?我无法使用按位not运算符得到预期的答案。谢谢你的帮助 我正在努力学习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; },c++,bit-manipulation,C++,Bit Manipulation,答案应该是190或1011110二进制,那么为什么我得到-66呢? 我使用Visual C++ 2010。< P>使用无符号整数,而不是签名的整数。你得到一个负数的原因是因为现在大多数计算机都使用 这是数据在按位not前后的样子: before | after 0100 0001 | 1011 1110 (实际上可能有32位,因为您使用的是int而不是char;这里最好使用的类型可能是uint8\u t) 在二的补码中,如果最高有效位为1,则数字为负数。不是的,是的。在2的恭维语中,
我使用Visual C++ 2010。< P>使用无符号整数,而不是签名的整数。你得到一个负数的原因是因为现在大多数计算机都使用 这是数据在按位not前后的样子:
before | after
0100 0001 | 1011 1110
(实际上可能有32位,因为您使用的是int
而不是char
;这里最好使用的类型可能是uint8\u t
)
在二的补码中,如果最高有效位为1,则数字为负数。不是的,是的。在2的恭维语中,要对一个数字求反,可以取按位not并加1。如果取
1011110
并将其反转,则得到01000001
。现在添加一个,结果是0100010
。如果你把它转换成十进制,你会得到66。因为第一位是1,所以加上减号,得到-66,这是一个意外值。使用无符号整数而不是有符号整数。你得到一个负数的原因是因为现在大多数计算机都使用
这是数据在按位not前后的样子:
before | after
0100 0001 | 1011 1110
(实际上可能有32位,因为您使用的是int
而不是char
;这里最好使用的类型可能是uint8\u t
)
在二的补码中,如果最高有效位为1,则数字为负数。不是的,是的。在2的恭维语中,要对一个数字求反,可以取按位not并加1。如果取
1011110
并将其反转,则得到01000001
。现在添加一个,结果是0100010
。如果你把它转换成十进制,你会得到66。由于第一位是1,所以加上负号,得到-66,这是一个意外值。您正在处理中的有符号数字。该值已超过最大正值(127)并被换行到负空间
您可以将其打印为无符号字符/整数(即,
(unsigned int)notletter
或static\u cast(notletter)
)。您正在处理中的有符号数字。该值已超过最大正值(127)并被换行到负空间
您可以将其打印为无符号字符/整数(即,
(unsigned int)notletter
或static_cast(notletter)
)。请注意,结果将远大于他期望的190
,除非他的平台有8位int
s(这在AIK是不可能的)注意,结果将比<代码> 190代码/代码>要大很多——除非他的平台有8bit <代码> int s(这是不可能的),几乎和我不做C++一样混乱,所以我不能具体告诉你如何修复它。但是如果你的字符被签名,如果它不是,那么10111110=66,和我不做C++完全一样的混淆,所以我不能具体告诉你如何修复它,但是如果你的字符被签署了,10111110=-66,如果不是,则190。