시프트 연산을 공부중에 헷갈리는게 있어서 질문드립니다.
&이랑 |은 어느정도 이해가 되었는데 토글에서 좀 막힙니다.
책 본문에서는 토글의 예시로 flag ^= 2; 이렇게 들어주셨는데,
flag ^= 7;와 flag ^= 1 << 7의 차이가 궁금합니다.
어쨌든 7번째 자리를 토글하는 것은 똑같지 않나요..?
시프트를 하는 이유가 뭔지 이해가 잘 안됩니다.
7은 2진수로 0111입니다.
8비트로 표현하면 0000 0111입니다.
flag = 0이면
flag ^= 7은
0000 0111 비트이므로 3개의 비트를 켜는 것이 됩니다.
따라서 flag의 값은 7이 됩니다.
flag = 7이면 비트 표현은 0000 0111입니다.
flag ^= 7을 하면
0000 0111 ^ 0000 0111이므로
1인 비트가 전부 0으로 토글됩니다. 따라서 flag는 0이 됩니다.
1 << 7은 1을 왼쪽으로 비트를 7번 이동합니다.
1을 8비트로 표현하면 0000 0001입니다.
왼쪽으로 7번 비트 이동을 하면
1000 0000이 됩니다.
flag = 0이므로
flag ^= 1 << 7을 하면
0000 0000 ^ 1000 0000이므로 결과는 1인 비트를 켜는 것이 되어 1000 000이 됩니다. 10진수로는 128이 됩니다.
두 표현은 다릅니다.
시프트를 쓰는 이유는 C 언어에는 2진수 리터럴을 표현하는 방법이 없기 때문이기도 합니다.
int x = 0b00000111; // 숫자 7
이와 같이 0b를 접두어로 사용해서 2진수 리터럴을 입력하는 방법이 없습니다. 따라서 필요에 따라 시프트 연산을 사용합니다.(시프트 연산과 OR 연산의 조합 등을 활용하여...)
GCC 컴파일러는 자체 확장 기능으로 위와 같은 표현을 허용하지만, C 언어 표준은 아니며 VC++이나 다른 C 언어 컴파일러에서 지원하지 않습니다.
C++14에서는 위와 같은 표현이 가능합니다.