前寫程序最多也只是字節級別操作,用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 |
} |
其輸出結果為:
http://www.dushibaiyu.com/2015/07/cpp_get_bit_value.html

