我试图了解char上不同位的状态
我想说:
char a = 11 //00001011 in binary
如何检索当前为0的位号5并将其转换为bool变量?我该怎么设置呢?
答案 0 :(得分:6)
您可以使用一些按位运算符:
bool fifthBitSet = a & 0x10;
或者,更一般地说:
bool nThBitSet = a & ( 0x1 << n );
错过了设置部分:
a |= 0x1 << n; // set n'th bit
答案 1 :(得分:3)
正如你所说:
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
要设置你的位,你需要一个按位OR(|)
a |= 0x10; // 00001011
// | 00010000 because 1 | anything = 1
// ----------
// 00011011 The value is set!
为了测试该位,我们可以使用逐位AND(&amp;)
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
< / p>
当谈到比特时,最好注意哪个是最低有效位,0或1基于完全清楚。
答案 2 :(得分:2)
您可以使用位掩码测试这些位:
a & 0b00010000
答案 3 :(得分:2)
从最右边的位开始计数:
测试它:
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
}
答案 4 :(得分:2)
你提到第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);
有关更多信息,wikipedia article按位运算非常好。
答案 5 :(得分:1)
好吧,你可以使用这组函数来获取和设置位状态,我想:
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
}
我仍然想知道为什么你需要使用它,而不是bitsets。 )
答案 6 :(得分:0)
您可以使用按位AND来了解状态。
unsigned int number = 11;
与要单独检查位位置的值的编号,其余位为0。
假设我要检查位0,然后
if(a&0x00000001)
puts(" 01h bit position is 1")
else
puts(" 01h bit position is 0")