작성
·
311
1
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
강의 14분에 item3 를 사용했을때
items_flag &= ~opt3; 를 하셨는데
items_flag ^= opt3; 로 해도 괜찮은가요?
둘 사이에 차이가 있는지 아니면 같은 건지 궁금합니다!
답변 1
2
안녕하세요, 답변 도우미 Soobak 입니다.
두 코드 라인은 수행하는 작업이 다릅니다.
items_flag &= ~opt3;
은 opt3
의 비트를 반전시킨 후에 items_flag
와 AND
연산을 수행합니다.
해당 강의에서 학습하신 내용처럼, 이는 items_flag
에서 opt3
에 해당하는 비트를 제거하는 것과 같습니다.
반면, items_flag ^= opt3;
은 items_flag
와 opt3
간의 XOR
연산을 수행합니다.XOR
연산은 두 비트가 다르면 1
을, 두 비트가 같다면 0
을 반환합니다.
즉, 이 연산은 opt3
에 해당하는 비트를 itmes_flag
에서 토글(toggle, 상태 전환) 하는 작업을 수행합니다.
따라서, items_flag &= ~opt3;
은 items_flag
에서 opt3
에 해당하는 비트를 꺼내는 역할을,items_flag ^= opt3;
은 items_flag
에서 opt3
에 해당 하는 비트를 토글하는 역할을 합니다.
하지만, 질문자 님의 질문 의도를 고려해보면,opt3
에 해당하는 비트만 items_flags
에 이미 설정되어 있는 경우에 한정해서는 items_flag ^= opt3;
을 사용하여도 해당 비트를 꺼낼 수 있기 때문에 질문하신 것이 아닐까 생각됩니다.
위 상황과 같은 조건이 아니라면, 두 연산은 차이가 있습니다.
개인적인 의견을 보태보자면, 이런 상황에서는 직접 여러가지 경우의 코드를 작성하여 테스트해보는 것이 도움이 많이 되는 것 같습니다.
예시 코드와 실행 결과를 첨부드립니다.
#include <iostream>
#include <bitset>
int main()
{
unsigned char item_flag = 219; // 이진수로 1101 1011
const unsigned char opt3 = 38; // 이진수로 0010 0110
cout << "item_flag & (~opt3) 결과 : [" << bitset<8>(item_flag & (~opt3)) << "]\n";
cout << "item_flag ^ opt3 결과 : [" << bitset<8>(item_flag ^ opt3) << "]\n";
return 0;
}
실행 결과