如何在不使用bitset的情况下知道C ++中的位状态?

时间:2012-10-18 13:55:55

标签: c++ c bit-manipulation

我试图了解char上不同位的状态

我想说:

char a = 11 //00001011 in binary

如何检索当前为0的位号5并将其转换为bool变量?我该怎么设置呢?

7 个答案:

答案 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")