0

이것은 마지막 게시물의 업데이트이지만이 작동 방식을 이해하는 데 많은 어려움을 겪고 있습니다.비트 연산 및 "플래그"설정

void set_flag(int* flag_holder, int flag_position); 
int check_flag(int flag_holder, int flag_position); 

int main(int argc, char* argv[]) 
{ 
    int flag_holder = 0; 
    int i; 
    set_flag(&flag_holder, 3); 
    set_flag(&flag_holder, 16); 
    set_flag(&flag_holder, 31); 
    for(i = 31; i >= 0; i--) { 
     printf("%d", check_flag(flag_holder, i)); 
     if(i % 4 == 0) 
      printf(" "); 
    } 
    printf("\n"); 
    return 0; 
} 

그리고 할당을 위해 우리가 출력이 같도록, 기능의 set_flag 및 check_flag 쓰기로되어있다 : 내가 이해에서 그래서

1000 0000 0000 0001 0000 0000 0000 1000 

그래서 주요 기능을 제공했다 , "set_flag"함수를 사용하여 n 번째 비트가 1인지 확인했습니다. 그리고 "check_flag"함수는 n 번째 비트가 0 일 때 0, 1 일 때 1 인 정수를 반환합니다. "set_flag"가 실제로 무엇을하는지 이해하고 어떻게 3, 16, 31을 "플래그"로 저장하고 "check_flag"에 1을 반환하는지 이해합니다.

+0

시도한 내용과 실패한 부분은 무엇입니까? [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve)을 읽어보십시오. –

답변

0

이진 또는 16 진수 값을 사용하여 작업 할 때 공통적 인 접근 방법은 주 값에 적용 할 마스크를 정의하는 것입니다.

포괄적 인 OR 연산자 '|'를 사용하여 하나 이상의 비트를 '1'로 쉽게 설정할 수 있습니다.

예 : 우리가 검사 할 : 우리는 당신이 AND 연산자 '&'

등을 사용할 수있는 특정 비트를 테스트하기 위해 '1'

main value 01011000 | 
mask  00000001 = 
result  01011001 

에 비트 # 0을 설정하려면 비트 # 3

main value 01011000 & 
mask  00001000 = 
result  00001000 

참고 : 결과를 올바르게 포맷해야 할 수 있습니다. 여기서 & 연산은 0 또는 0이 아닌 값을 반환합니다 (단, '1'은 필요하지 않음). 이러한 시나리오에서

void set_flag(int* flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    flag_holder = flag_holder | mask; 
} 

int check_flag(int flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    int check = flag_holder & mask; 
    return (check !=0 ? 1 : 0); 
} 

우리가 체크/하나의 비트를 설정하는 바이너리 마스크가 필요합니다 그래서 여기

는이 개 기능 set_flag 및 check_flag이다. 코드 "int mask = 1 < < flag_position;" 기본적으로 비트 # 0을 '1'로 설정하고 왼쪽으로 설정/확인하려는 #bit로 이동합니다.

0

기능 Set_flag 및 기능 Check_flag는 :

void set_flag(int* flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    *flag_holder = *flag_holder | mask; 
} 

int check_flag(int flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    int check = flag_holder & mask; 

    return (check !=0 ? 1 : 0); 
} 

메인 프로그램과 함께 실행을하면 원하는 결과를 얻을 것이다.