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)。次に、8つのコマンドを実行する必要があります。

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

1つのコマンドだけでゼロ値を即座にチェックできるポータブルで便利な方法はありますか?関数とテンプレートを試しましたが、パフォーマンスが非常に遅くなりました。そして、私はユニオンを試しました、私のコンパイラはビット[配列]をサポートしていません...。

4

6 に答える 6

1

ユニオンを使用してください、これはそれが意図されているものです

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 に答える