簡體   English   中英

我沒有使用Bitwise NOT運算符得到期望的答案。 希望能有所幫助

[英]I am not getting the answer I expect using the Bitwise NOT operator. Would appreciate some help

我正在通過一本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。

使用無符號整數而不是有符號整數。 之所以得出負數,是因為當今大多數計算機都使用二進制補碼

這是按位前后數據的樣子:

before     | after
0100 0001  | 1011 1110

(實際上,那里可能有32位,因為您使用的是int而不是char ;此處最好使用的類型可能是uint8_t

在二進制補碼中,如果最高有效位為1,則數字為負。 在二的補語中,要取反一個數字,您可以按位取非,然后加1。如果您取1011 1110並將其取反,則得到0100 0001 現在,您添加一個,結果為0100 0010 如果將其轉換為十進制數,則得到66。由於第一位為1,所以減去負號,得到-66,這是意外值。

您正在處理Two's Complement中的一個帶符號的數字。 該值已超過最大正值(127),並包裝到負空間。

您可以將其打印為無符號字符/整數(即(unsigned int)notletterstatic_cast<unsigned int>(notletter) )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM