我正在尝试了解 char 上不同位的状态
假设我有:
char a = 11 //00001011 in binary
如何检索当前为 0 的第 5 位并将其转换为 bool 变量?我该如何设置?
我正在尝试了解 char 上不同位的状态
假设我有:
char a = 11 //00001011 in binary
如何检索当前为 0 的第 5 位并将其转换为 bool 变量?我该如何设置?
您可以使用一些位运算符:
bool fifthBitSet = a & 0x10;
或者,更一般地说:
bool nThBitSet = a & ( 0x1 << n );
错过了设置部分:
a |= 0x1 << n; // set n'th bit
正如您所指出的:
char a = 11 // == 00001011 in binary
既然你说bit number 5
现在很清楚,让我们*定义位的位置,因为你正在谈论它们:
pos 8 7 6 5 4 3 2 1
value [0][0][0][0][1][0][1][1]
您想测试第 5 位,这意味着您需要一个访问第五位的掩码,这里有一些掩码:
your number: 00001011
0x1 mask: 00000001
0x2 mask: 00000010
0x4 mask: 00000100
0x8 mask: 00001000
0x10 mask: 00010000 <-- So that's the one we want, the 5th bit
要设置您的位,您需要按位或 (|)
a |= 0x10; // 00001011
// | 00010000 because 1 | anything = 1
// ----------
// 00011011 The value is set!
要测试位,我们可以使用按位与 (&)
bool something = a & 0x10; // 00001011
// & 00010000 because only 1 & 1 = 1
// ----------
// 00000000 something will be 0 (false)
*有人指出,这是一个基于 1 的索引,而不是更典型的基于 0 的索引。这是真的。根据描述,我选择将问题解读为“第 5 位”,这意味着基于典型(人类)对 8 位中的 1、2、3、4 等进行计数。
如果您更愿意使用基于 0 的索引,这没问题,只需将相同的逻辑“移位”一位,基于 0 的索引中“第 5”位的掩码是0x20
在谈论位时,最好注意哪个是最低有效位,并且基于 0 或 1 是完全清楚的。
您可以使用位掩码测试位:
a & 0b00010000
从 0 开始计数是最右边的位:
要测试它:
int b = 5;
bool n = a & (1 << b);
设置(或清除)位b
:
if (n) { // set
a |= (1 << b); // RHS only has bit 'b' set
} else { // clear
a &= ~(1 << b); // RHS has every bit _except_ bit 'b' set
}
您提到第 5 位,我相信您正在查看第 5 个最低有效位。
您还询问了如何在特定位置设置位。为此,请使用按位 OR - |
:
a = a | 0x10;
正如已经回答的那样,使用按位 AND - 测试该位&
:
bool isSet = a & 0x10;
通常你会使用一个位置标志,比如0x10
,但是使用位移给出的概括非常有用,特别是如果你将它们包装到一个函数中:
int pos = 5;
// set bit 5:
a = a | (0x1 << pos);
// test bit 5:
bool isSet = a & (0x1 << pos);
有关更多信息,关于按位运算的维基百科文章非常好。
好吧,您可以使用这组函数来获取和设置位状态,我想:
bool getBit(int data, int bitNumber) {
int flag = 1 << bitNumber - 1;
return (bool)(data & flag);
}
void setBit(int& data, int bitNumber) {
int flag = 1 << bitNumber - 1;
data |= flag;
}
...
int main() {
int a = 11;
cout << getBit(a, 5); // false
setBit(a, 5);
cout << getBit(a, 5); // true
}
我仍然想知道为什么您需要使用它,而不是位集。)
您可以使用按位 AND 来了解状态。
unsigned int number = 11;
AND 与您要单独检查的位位置设置的值的数字,其余位为 0。
假设我想检查位 0,那么
if(a&0x00000001)
puts(" 01h bit position is 1")
else
puts(" 01h bit position is 0")