4

假设我有一个byte结构,如下所示:

struct one_byte
{
char b1 : 1,
     b2 : 1,   
     b3 : 1,   
     b4 : 1,   
     b5 : 1,   
     b6 : 1,   
     b7 : 1,   
     b8 : 1;   
}foo;

在某些情况下,我需要检查(foo == 0),然后我必须执行八个命令:

if(foo.b1 == 0 &&
   foo.b2 == 0 &&
   foo.b3 == 0 &&
...and so on

是否有任何便携且方便的方法可以仅通过单个命令立即检查零值?我尝试了函数和模板,它们的执行速度非常慢。我试过联合,我的编译器不支持位[数组] ....

4

6 回答 6

1

使用union,这就是它的用途

union {
  struct {
    char b1:1,b2:1,b3:1,b4:1,b5:1,b6:1,b7:1,b8:1; 
  } bits;
  unsigned char byte;
} u;

那么您可以直接分配字节

u.byte = 15;

或单独的位

u.bits.b3 = 1;

示例

int main() {
  u.byte = 0;
  printf("%x\n", u.byte);
  u.bits.b3 = 1;
  u.bits.b4 = 1;
  printf("%x\n", u.byte);
  return 0;
}

将输出

0
c  // 12 in decimal, since b3 and b4 are set to 1
于 2013-02-11T03:47:13.747 回答
1
struct one_byte zero = { 0 };

!memcmp (&variable_1, &zero, sizeof (struct one_byte))

可能是一个解决方案,但我不知道这是否是一个聪明的主意。也许只是取消或多或少标准的位设置方式会做得更好:

#define SET_BIT(v, n) (v) |= (1<<n)
#define CLR_BIT(v, n) (v) &= ~(1<<n)
#define GET_BIT(v, n) ((v) & ~(1<<n) == 0)

char foo;

if (foo == 0)
   so_what ();
于 2013-02-11T03:52:25.273 回答
0

我认为这不会带来任何显着的性能提升。

if (memcmp(&foo, "\0", 1) == 0)
{
    // all zero
}

我手头没有 C++ 规范,但 C99 规范 6.7.2.1/13 说(强调我的):

在结构对象中,非位域成员和位域所在的单元的地址按声明顺序递增。指向结构对象的指针,经过适当转换,指向其初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。结构对象内可能有未命名的填充,但不是在其开头

于 2013-02-11T03:39:10.160 回答
0
#include <iostream>
#include <cstring>

using namespace std;
struct one_byte{
  char b1:1;
  char b2:1;
  char b3:1;
  char b4:1;
  char b5:1; 
  char b6:1;
  char b7:1;
  char b8:1;
    }__attribute__((packed));

int main(int argc, char *argv[])
{
  one_byte b1;
  int j;
  memcpy(&j, &b1, sizeof(b1)); 
  if(j == 0) cout << "Its 0";
  else cout << "It's not 0";
  return 0;
}

上面的程序呢?

于 2013-02-11T03:43:30.053 回答
0
!*((unsigned char *) &foo)

应该做的伎俩。请注意,我使用!运算符来检查零值——如果您不喜欢这样,请随意使用== 0

于 2013-02-11T03:44:03.667 回答
0

听起来你想变得肮脏,那么如何:

struct one_byte Other; // a real variable
...   
if(*(char*)&Other == '\0')
于 2013-02-11T03:45:06.513 回答