发布
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。