2011-09-04 93 views
0

我正在努力学习一些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.

+1

几乎相同的困惑,在http://stackoverflow.com/questions/7274753/bitwise-complement-operator – AnT

+1

我根本不做C++所以我不能告诉你具体如何解决它,但10111110 = -66如果您的字符已签名,则为190,如果不是。 – aehiilrs

回答

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,意外值。

+0

请注意,结果会比他期望的'190'大_much_,除非他的平台具有8位'int'(这是不可能的AFAIK) – Mat

0

您正在处理Two's Complement中的签名号码。该值已超过最大正值(127)并包裹到负值空间。

可以将其打印为无符号字符/整数(即,(unsigned int)notletterstatic_cast<unsigned int>(notletter))。

相关问题