2

我正在尝试画一条线,根据值分成几段。例如,如果有 5 个字段,并且所有 5 个字段都为真,那么我的 Line 看起来像

-----

如果说第一个和最后一个字段为真,而其他一切都是假的,那么它将是

-   -

我想我可以用某种掩码来做到这一点。首先,我以前从来没有做过一点面具,但我想我到处都看到过它们。我想知道如何解决这个问题,并使用枚举而不是 1/0 来提高可读性。据我从数据中可以看出,对于不同的属性,我只需要 1 或 0 的值。但是,最好知道如何将其中一个值设为三级或更高级别的枚举以供将来参考。谢谢!

试图做类似的事情:

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

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

然后根据对象的值,我可以做

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

然后稍后,以某种方式检查位掩码的值,然后根据值相应地绘制线。

4

3 回答 3

3

不确定您的具体要求是什么,但这是用 C 编写的一种方式:

#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 回答