問題描述:
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的字符),是錯誤的!!!