如何設置,清除和切換單個位?

您如何設置,清除和切換? html


#1樓

使用此處定義的運算符之一。 ios

要設置一點,請使用int x = x | 0x?; int x = x | 0x?;? 是二進制形式的位位置。 數組


#2樓

對於初學者,我想用一個例子來解釋一下: 測試

例: 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)

#3樓

由於這被標記爲「嵌入式」,因此我假設您正在使用微控制器。 以上全部建議都是有效且可行的(讀-修改-寫,聯合,結構等)。 htm

可是,在基於示波器的調試中,我驚訝地發現與直接將值寫入微控制器的PORTnSET / PORTnCLEAR寄存器相比,這些方法在CPU週期上具備至關大的開銷,這在存在緊密循環/高電平的狀況下確實有所不一樣頻率ISR的切換引腳。 索引

對於那些不熟悉的人:在個人示例中,微控制器具備反映輸出引腳的通用引腳狀態寄存器PORTn,所以執行PORTn | = BIT_TO_SET會致使對該寄存器進行讀-修改-寫操做。 可是,PORTnSET / PORTnCLEAR寄存器爲1表示「請將該位設爲1」(SET)或「請將該位設爲0」(CLEAR),爲0則表示「請單獨保留該引腳」。 因此,你最終有兩個端口地址取決因而否你設置或清除該位(並不老是很方便),但更快的反應和更小的彙編代碼。


#4樓

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] =1IsGph[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個月的快速測試,證實了咱們從中獲取數據的大型機系統實際上發生了故障。 位數組的簡單性使其對正確性的置信度很高-例如,與搜索方法相比。


#5樓

擴展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;
}
相關文章
相關標籤/搜索