1

我正在尝试了解 char 上不同位的状态

假设我有:

char a = 11 //00001011 in binary

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

4

7 回答 7

6

您可以使用一些位运算符:

bool fifthBitSet = a & 0x10;

或者,更一般地说:

bool nThBitSet = a & ( 0x1 << n );

错过了设置部分:

a |= 0x1 << n; // set n'th bit
于 2012-10-18T13:57:35.010 回答
4

正如您所指出的:

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 是完全清楚的。

于 2012-10-18T14:20:10.143 回答
2

您可以使用位掩码测试位:

a & 0b00010000
于 2012-10-18T13:57:37.833 回答
2

从 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
}
于 2012-10-18T13:57:46.227 回答
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);

有关更多信息,关于按位运算的维基百科文章非常好。

于 2012-10-18T14:02:55.250 回答
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
}

我仍然想知道为什么您需要使用它,而不是位集。)

于 2012-10-18T14:01:17.007 回答
0

您可以使用按位 AND 来了解状态。

unsigned int number = 11;

AND 与您要单独检查的位位置设置的值的数字,其余位为 0。

假设我想检查位 0,那么

if(a&0x00000001)
   puts(" 01h bit position   is 1")
else
   puts(" 01h bit position   is 0")
于 2015-11-30T09:02:23.737 回答