2

値に応じてセグメントに分割された線を描画しようとしています。たとえば、5つのフィールドがあり、5つのフィールドすべてが真である場合、私の行は次のようになります。

-----

最初と最後のフィールドが真であり、他のすべてが偽であると言う場合、それは

-   -

ある種のビットマスクでこれができると思いました。まず、これまで少しマスクをしたことはありませんが、あちこちで見たことがあると思います。どうすればこれを実行でき、読みやすさのために1/0の代わりに列挙を使用できるのか疑問に思いました。データからわかる限り、さまざまなプロパティに必要なのは1または0の値だけです。ただし、将来の参照用に、値の1つを3レベル以上の列挙にする方法を知っておくとよいでしょう。ありがとう!

次のようなことをしようとしています:

enum CodingRegions {
    Coding = 0x01,
    NonCoding = 0x02
};

enum Substitution {
    Synonymous = 0x04,
    NonSynonmous = 0x05
};

次に、オブジェクトの値に基づいて、次のことができます。

bitmask???? = object.CodingRegion | object.Substitution;

その後、ビットマスクの値をなんらかの方法で確認し、値に基づいて線を引きます。

4

3 に答える 3

3

要件が正確にわからない場合は、Cで記述する1つの方法を次に示します。

#include <stdio.h>

typedef enum MyField_ {
  hasWombat        = 1 << 0,
  hasTrinket       = 1 << 1,
  hasTinRoof       = 1 << 2,
  hasThreeWheels   = 1 << 3,
  myFieldEnd       = 1 << 4,
} MyField;

void printMyField(MyField data) {
  MyField field = 1;
  while (field != myFieldEnd) {
    printf("%c", data & field ? '-' : ' ');
    field <<= 1;
  }
  printf("\n");
}

int main() {
  MyField data = hasTrinket | hasThreeWheels;
  printMyField(data);
  data |= hasWombat; // set a field
  data &= ~hasTrinket; // clear a field
  printMyField(data);
  return 0;
}
于 2012-05-22T23:48:40.127 に答える
1

これがあなたが望むものかどうかはわかりませんが、:

// assumed Coding/NonCoding, Synonomous/NonSynonymous are opposites of each other. If not, add more bit fields

enum CodingRegions 
{
    Coding = 1 << 0
} ;

enum Substitution
{
    Synonymous = 1 << 1
}

void PrintBitmask( NSUInteger bitmask )
{
    printf( "%s", bitmask & Coding != 0 ? "-" : " " ) ;
    printf( "%s", bitmask & Substitution != 0 ? "-" : " " ) ;

    printf( "\n" ) ;
}

あなたPrintBitmask()もこのように見えるかもしれません:

void PrintBitmask( NSUInteger bitmask )
{
    printf( "%s", bitmask & Coding != 0 ? "Coding" : "Noncoding" ) ;
    printf( "|" ) ;
    printf( "%s", bitmask & Substitution != 0 ? "Synonymous-" : "Nonsynonymous" ) ;

    printf( "\n" ) ;
}
于 2012-05-22T23:53:26.470 に答える
-1
/* I prefer macros over enums (at least for something this simple) */
#define SPACE 0x0
#define DASH  0x1

/* input fields */
int fields[5] = {DASH,SPACE,SPACE,SPACE,DASH};

/* create bitmask */
for (int i=0; i<5; i++) {
    mask |= (fields[i] << i);
}

/* interpret bitmask and print the line */
for (int i=0; i<5; i++) {
    if (mask & (fields[i] << i)) {
        printf("%c", '-');
    } else {
        printf("%c", ' ');
    }
}
于 2012-05-22T23:29:43.307 に答える