2012-05-22 2 views
2

값에 따라 세그먼트로 구분 된 선을 그리려는 중입니다. 5 개 필드, 모든 5 개 필드 사실이 된 경우 예를 들어, 첫 번째와 마지막 필드는 사실 말한다면 내 라인objective-c 또는 C의 비트 마스크 열거 형

----- 

처럼 보일 것이고, 다른 모든 잘못된 것, 그것은 것

- - 

나는 어떤 종류의 비트 마스크로 이것을 할 수 있다고 생각했습니다. 우선, 전에는 가면을 한 번도 해본 적이 없지만, 내가 여기 저기에있는 것을 본 것 같습니다. 나는 이것에 관해 어떻게 할 수 있는지 궁금해서, 가독성을 위해 1/0 대신 enumeration을 사용했다. 데이터에서 볼 수있는 한, 다른 속성에 대해 1 또는 0 값만 필요합니다. 그러나 나중에 참조 할 수 있도록 값 중 하나를 세 가지 수준 또는 그 이상의 열거 형으로 표시하는 방법을 알고있는 것이 좋습니다. 감사! 나는 어떻게 든 비트 마스크의 값을 확인, 나중에 그런

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

을하고 그릴 수있는 개체의 값에 따라 다음

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

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

:

는 그런 짓을하려고 라인은 그에 따라 값이 무엇인지에 따라 결정됩니다.

+1

@Oli Charlesworth 링크를 제공해 주셔서 감사합니다. 과학은 의미가 있지만 텍스트로 값을 얻는 방법을 모르겠습니다. 기사가 말했듯이, 나는 수동으로 뭔가를 할 수 있고 그 상태 비트를 검사 할 수있다. 그러나 나는 값을 할 필요가 없도록 텍스트로하는 방법을 궁금해했다. – Crystal

+2

'' '과''-''를 저장하는'char []'을 사용하지 않는 것이 어떨까요? 오버 헤드가 중요 할 것 같지 않습니다 ... –

답변

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") ; 
} 
-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", ' '); 
    } 
} 
+0

내 질문을 업데이트했습니다. 감사. – Crystal

+0

내 대답이 업데이트되었습니다. –

2

확실하지 요구 사항이 있지만 여기가 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; 
} 
+1

정교한'printf % c' 사업보다는'putchar'을 사용해야 할 것입니다. – ndkrempel