您如何設置,清除和切換? html
使用此處定義的運算符之一。 ios
要設置一點,請使用int x = x | 0x?;
int x = x | 0x?;
在?
是二進制形式的位位置。 數組
對於初學者,我想用一個例子來解釋一下: 測試
例: ui
value is 0x55; bitnum : 3rd.
使用&
運算符檢查該位: spa
0101 0101 & 0000 1000 ___________ 0000 0000 (mean 0: False). It will work fine if the third bit is 1 (then the answer will be True)
切換或翻轉: 調試
0101 0101 ^ 0000 1000 ___________ 0101 1101 (Flip the third bit without affecting other bits)
|
操做員:設置位 code
0101 0101 | 0000 1000 ___________ 0101 1101 (set the third bit without affecting other bits)
由於這被標記爲「嵌入式」,因此我假設您正在使用微控制器。 以上全部建議都是有效且可行的(讀-修改-寫,聯合,結構等)。 htm
可是,在基於示波器的調試中,我驚訝地發現與直接將值寫入微控制器的PORTnSET / PORTnCLEAR寄存器相比,這些方法在CPU週期上具備至關大的開銷,這在存在緊密循環/高電平的狀況下確實有所不一樣頻率ISR的切換引腳。 索引
對於那些不熟悉的人:在個人示例中,微控制器具備反映輸出引腳的通用引腳狀態寄存器PORTn,所以執行PORTn | = BIT_TO_SET會致使對該寄存器進行讀-修改-寫操做。 可是,PORTnSET / PORTnCLEAR寄存器爲1表示「請將該位設爲1」(SET)或「請將該位設爲0」(CLEAR),爲0則表示「請單獨保留該引腳」。 因此,你最終有兩個端口地址取決因而否你設置或清除該位(並不老是很方便),但更快的反應和更小的彙編代碼。
Visual C 2010,也許還有許多其餘編譯器,都直接支持內置的位操做。使人驚訝的是,這有效,即便sizeof()
運算符也能夠正常工做。
bool IsGph[256], IsNotGph[256]; // Initialize boolean array to detect printable characters for(i=0; i<sizeof(IsGph); i++) { IsGph[i] = isgraph((unsigned char)i); }
所以,對於您的問題, IsGph[i] =1
或IsGph[i] =0
使設置和清除布爾值變得容易。
查找不可打印的字符:
// Initialize boolean array to detect UN-printable characters, // then call function to toggle required bits true, while initializing a 2nd // boolean array as the complement of the 1st. for(i=0; i<sizeof(IsGph); i++) { if(IsGph[i]) { IsNotGph[i] = 0; } else { IsNotGph[i] = 1; } }
請注意,此代碼沒有什麼「特殊的」。 它對待就像一個整數-從技術上來講,它是。 一個1位整數,能夠容納2個值,而且只能包含2個值。
我曾經使用這種方法來查找重複的貸方記錄,其中貸方編號是ISAM密鑰,使用6位數的貸方編號做爲位數組的索引。 通過8個月的快速測試,證實了咱們從中獲取數據的大型機系統實際上發生了故障。 位數組的簡單性使其對正確性的置信度很高-例如,與搜索方法相比。
擴展bitset
答案:
#include <iostream> #include <bitset> #include <string> using namespace std; int main() { bitset<8> byte(std::string("10010011"); // Set Bit byte.set(3); // 10010111 // Clear Bit byte.reset(2); // 10010101 // Toggle Bit byte.flip(7); // 00010101 cout << byte << endl; return 0; }