將保存有很長的0\1串的QString或string進行按位與、按位或操作

問題描述:

0\1串保存在QString中,對兩個等長QString進行按位與,一般方法是將QString轉換成QBitArray或者int型數據,然後進行按位與操作。

由於我要處理的0\1串可能很長(幾十位甚至幾百位),將QString轉成longlong也可能裝不下,所以自己寫了個函數,將QString中的字符一位一位地進行按位與。

思路:

將兩個QString中的字符一位一位地取出來,將QChar轉換成int,對兩個int進行按位與,將按位與得到的結果int型的數,轉換成QChar或者char,存進保存結果的QString中。

此處貼上函數代碼:

// 函數 按位與

QString bit_and(QString &a,QString &b)
{
    QString c;
    int ii =0;
    for(const auto &i:a)
    {
        // 將字符串a和b的對應位先轉換成int,再做按位與運算
        int int_bit =( i.digitValue() & (b[ii]).digitValue());

        if (int_bit==1)
        {
            c.push_back('1');
        }
        else
        {
            c.push_back('0');
        }
        ++ii;
    }
    return c;
}

// 函數 按位或

QString bit_or(QString &a,QString &b)
{
    QString c;
    int ii =0;
    for(const auto &i:a)
    {
        // 將字符串a和b的對應位先轉換成int,再做按位與運算
        int int_bit =( i.digitValue() | (b[ii]).digitValue());

        if (int_bit==1)
        {
            c.push_back('1');
        }
        else
        {
            c.push_back('0');
        }
        ++ii;
    }
    return c;
}

寫程序的過程中遇到的問題:

int型的數在轉換成char或者QChar時,是按ASCII碼進行轉換的!!!(例如數字0會轉換成ASCII編碼爲0的字符’NUL’)

比如 int 型數據0,對應ASCII編碼爲0的字符NUL,所以直接強制轉換成char類型就錯了!隱式轉換成char類型也一樣錯了!
調試的時候就可以看到:
在這裏插入圖片描述

傳進去的a是這樣子的,裝着0\1串,0對應的ASCII編碼是48。
在這裏插入圖片描述
按位與後的結果int_bit也沒問題,而將int_bit轉換成char_bit(將int強制轉換成了char)後,圖上可以看到char_bit成了’\0’,對應的ASCII編碼是0而不是48,’\0’不同於’0’!!!!!

若將int_bit直接push_back到QString中去,int_bit是int型,QString中的元素的QChar型,會發生int轉QChar的隱式轉換,也是按ASCII編碼轉換的(數字0會轉換成ASCII編碼爲0的字符),是錯誤的!!!
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章