C/C++取出變量的每一位的值(第一次知道還有QBitArray)


前寫程序最多也只是字節級別操作,用char和memcpy進行一系列內存操作。此次一個sdk,其狀態值直接是每位一個標示,所以需要取出每位進行操作。當然CPP也有豐富的位運算操作,但是雖然也學過,知道意思,但是實際卻幾乎沒用過。這次只能動用它了。

第一種方法:思路就是全部用位與,這樣就能取出來每一位是否為1。直接上代碼吧,反正看了也就理解了。

1 uint j = 1;
2 for (uint k = 0;k < sizeof(uint) * 8;(j = j<<1),k++){
3     std::cout << "The " << k << " bit is :" << (i&j)  << std::endl;
4 }

這是取一個無符號整數的,當然其他類型一樣的、、

第二種方法,就是動用STL,CPP處理方便的確方便多了。有偉大的bitset

其構造函數就可以直接幫你取出值放到bitset中,其支持ullong類型還有string類型。

其也能直接轉換為string類型。缺點是其大小必須在編譯器就指定。

只是注意:在bitsit中取出的位置和轉換后的string取出的方向是不一樣(個人測試得出:bitset是從右向左,string是從坐向右)。

在Qt中也有一個處理位的類:QBitArray

這個類是可以更改大小的,用resize()去設定新的大小。只是這個類只能你自己一個位,一個位的去賦值(QBitArray 是從左向右方向的)。

QBitArray 和bitset都重載了 &,~,| ,^這些位運算符號。

下面給個都用的例子:(注意bitset[ n] 和 string[n] 取值的方向不一樣。 )

01 #include <QCoreApplication>
02 #include <QVariant>
03 #include <QBitArray>
04 #include <QDebug>
05 #include <bitset>
06 #include <iostream>
07  
08 int main(int argc, char *argv[])
09 {
10     QCoreApplication a(argc, argv);
11     uint i = 200;
12  
13     QBitArray bits;
14     bits.resize((sizeof(uint) * 8));
15  
16     uint j = 1;
17     for (uint k = 0;k < sizeof(uint) * 8;(j = j<<1),k++){
18         bits.setBit(k,(i&j));
19     }
20  
21     qDebug() << "QBitArray bits :" << bits;
22     std::bitset<sizeof(uint) * 8> bit(i);
23     std::cout << "std::bitset bit : " << bit << std::endl;
24     std::string str = bit.to_string();
25     std::cout << "std::bitset bit.to_string : " << str << std::endl;
26     std::cout << "std::bitset bit at 3 : " << bit[3] << std::endl;
27     std::cout << "std::string str at 3 : " << str.at(3) << std::endl;
28     qDebug() << "QBitArray bits at 3 :" << bits.at(3);
29  
30     return a.exec();
31 }

 

其輸出結果為:

bitvalue

http://www.dushibaiyu.com/2015/07/cpp_get_bit_value.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM