釋出
2009年1月6日

一點位運算

評分: 3.2/5 (21 票)
*****
這只是一個簡單方便的結構,用於定義一個變數型別和簡單的運算子過載,以便從字串中獲取一個位的值。

首先,我們宣告一個結構,所以
1
2
3
4
struct bin
{

};

接下來,我們需要建立一個私有變數來接受一個位元組,所以我們使用一個 unsigned char 並將其命名為“val”
1
2
private:
unsigned char val;

我們需要能夠給位元組賦值,所以我們建立子程式來接受位元組並將其設定為我們的私有變數
1
2
3
4
5
public:
bin(unsigned char v)
{
val=v;
}

最後但同樣重要的是運算子過載,這樣我們就可以決定我們想要哪個位
1
2
3
4
bool operator[](unsigned char i)
{
return (val&(1<<i))>>i;
}

快速解釋一下上面這個可能看起來很複雜的位運算語句——它接受一個數字 (i),然後找到該位是 1 還是 0,然後將返回值設定為該值 (1 或 0)。

所以我們完成的結構是
1
2
3
4
5
6
struct bin
{
private:unsigned char val;
public:bin(unsigned char v){val=v;}
bool operator[](unsigned char i){return (val&(1<<i))>>i;}
};


現在——如何使用它,在這個例子中,我們將使用一個名為“a”的 unsigned char 變數,它儲存“a”的 ASCII 值,即 97——然後找到它的所有位。

1
2
3
4
5
6
7
8
9
10
int main()
{
unsigned char a=97; // declare our "a"
for(unsigned int c=7;c!=-1;c--) // create a loop to access all the bits
{
printf("%u",bin(a)[c]); // print out the value of a at bit c.
}
getchar(); // wait for user input so we can see previous output
return 0;
}


由此我們應該得到“01100001”——97 的二進位制形式。

我希望這對任何人都有所幫助,這是我的第一篇文章——歡迎任何反饋或建議。

Chris。