인프런 커뮤니티 질문&답변

YANGHI KIM님의 프로필 이미지
YANGHI KIM

작성한 질문수

홍정모의 따라하며 배우는 C++

3.9 비트 플래그, 비트 마스크 사용법 Bit flags, Bit masks

연습문제 관련 질문드립니다.

해결된 질문

작성

·

208

1

마지막에 내주신 연습문제에서 '기사의 좋아요를 다시 클릭했을 때'를 저는 

my_article_flags ^= option_liked;로 했는데

답안에는 my_article_flags &= ~option_liked;로 되어있습니다.

마찬가지로 13:57초 부분에서도 items_flag &= ~opt3으로 하셨는데 저는 items_flags ^= opt3이라고 생각했습니다.

13:57초 부분이나 연습문제 부분이나 둘 다 같은 경우이고, ^= 을 쓰든 &= ~을 쓰든 결과는 똑같았는데 혹시 &=~ 대신에 ^=을 쓰면 안 되는 이유가 혹시 있을까요? 

^=을 쓰는 것은 이해가 쉽게 가지만 오히려 &=~ 을 쓰는 경우는 이해가 잘 안 돼서 쉽게 와닿지가 않습니다 ㅠ ㅠ 

답변 2

3

안녕하세요.

^= 을 쓰셔도 됩니다. 저도 이 강의를 들었을 때 기록해놨던 제 연습 문제의 풀이를 다시 찾아봣는데 질문자님처럼 ^= 을 사용해서 풀었더라구요! 

&=~ 은 해당 비트를 '삭제'한다는 것에 초점이 맞춰져 있습니다. 좋아요 상태를 상징하는 비트가 00000100 이라면 이의 보수(~)는 11111011 가 되겠죠! 이를 가지고 and 연산하면 좋아요 상태를 상징하는 세번째 자리의 비트를 무조건 0 으로 만들 수 있을겁니다. and 연산에서는 피연산자 중 하나라도 0 이 들어가면 0이 되니까요!

기사의 좋아요를 다시 클릭 한다는 것을 '좋아요를 취소 + 삭제한다'는 의미로 생각해본다면  &=~ 를 사용하는 풀이가 될 것 같아요.

기사의 좋아요를 다시 클릭한다는 것을 약간 상태를 반전시키는 토글의 느낌으로 좋아요 되어있는 상태라면 삭제가 되게끔, 좋아요가 안되어 있는 상태라면 좋아요가 되게끔 반전 시킨다는 의미로 해석했을 땐 질문자님처럼 ^= 을 쓰는 풀이가 맞을 것 같아요! 

이미 좋아요가 되어 있는 상태에서 좋아요를 다시 클릭하는 행위이니 좋아요는 삭제가 되야 합니다. 그러니 이러한 경우엔 &=~ 를 사용하든 ^= 를 사용하든 결과가 동일합니다.

1

YANGHI KIM님의 프로필 이미지
YANGHI KIM
질문자

감사합니다! 

YANGHI KIM님의 프로필 이미지
YANGHI KIM

작성한 질문수

질문하기