2014-11-24 3 views
1

현재 변수의 비트 상태를 기반으로 생성 된 문자열을 출력하는 코드를 작성하고 있습니다. 현재 내 코드는변수에 값을 할당하는 더 나은 방법

uint8_t importantVariable; 

if(BIT0&importantVariable){ 
    valA = 'A'; 
else{ 
    valA = 'B'; 
} 
if(BIT1&importantVariable){ 
    valB = 'A'; 
else{ 
    valB = 'B'; 
} 
if(BIT2&importantVariable){ 
    valC = 'A'; 
else{ 
    valC = 'B'; 
} 

printf(examplestring, "valA is %c, valB is %c, valC is %c",ValA,ValB,ValC); 

이 그러나 이러한 목표를 달성하기 위해 매우 투박한 방법처럼 보인다 내가 같은 일을 수행 할 수있는 짧은 방법이 있다면 궁금 이러한 라인을 따라 뭔가를 보인다.

답변

3

각 비트에 대해 가능한 값으로 배열을 만들고 시프트와 마스크의 조합을 사용하여 적절한 값을 얻을 수 있습니다.

// Rather than defining a mask, say, 0x04, define the number of right shifts 
// for the corresponding bit to get into the LSB position: 
#define BIT3_SHIFT 2 

static char bit3_values[] = {'A', 'B'}; 
... 
valA = bit3_values[(importantVariable >> BIT3_SHIFT) & 1]; 

이 방법들은 코드의 더 이상 일부 없도록 당신이 배열 이니셜 라이저에 목표 값을 이동할 수 있습니다 : 여기

은 예입니다. 또한 조건부 실행을 제거합니다.

또한 여러 개의 연속 비트 조합을 처리 할 수 ​​있습니다. 예를 들어, 비트 6과 7의 조합을 기반으로 네 가지 값 중 하나를 지정하려면 네 요소 배열을 정의하고 importantVariable을 6으로 시프트 한 다음 0x03으로 마스크를 적용한 다음 값.

2

하지만이 아닌 opmitization ...

, 짧은있는 방법은 삼항 연산자를 사용

valA = BIT0&importantVariable ? 'A' : 'B'; 
1

또 다른 가능성은 else들 피할 수 있습니다.

char valA = 'B'; 
char valB = 'B'; 
char valC = 'B'; 

if(BIT0&importantVariable) 
    valA = 'A'; 
if(BIT1&importantVariable) 
    valA = 'A'; 
if(BIT2&importantVariable) 
    valA = 'A'; 

3 진수 연산자를 선호하지만 (+1했습니다).

1

문 (BITX & importantVariable를) Asuming 항상 0 반환 또는 1 당신은 또한 사용할 수 있습니다

valx = 'B'- (BITX & importantVariable);

0

관련 비트 연속 비트가있는 경우에 당신이 더 일반적인 뭔가 할 수있는 :

char values[3] = { 0 }; 
for (int i = 0; i < 3; i++) 
{ 
    int bit = 1 << i; 
    values[i] = bit & importantVariable; 
} 
printf(examplestring, "valA is %c, valB is %c, valC is %c", values[0], values[1], values[2]); 
관련 문제