C Language [핵심정리] - 9
1. 최상위 비트와 최하위 비트
비트에서 첫 번째 비트를 최상위 비트(Most Significant Bit, MSB), 마지막 비트를 최하위 비트(Least Significant Bit, LSB)라고 부릅니다.
부호 있는 자료형의 최상위 비트는 부호비트라고도 불립니다. 이 비트가 1이면 음수, 0이면 양수입니다.
flag는 깃발에서 유래한 용어입니다. 깃발을 올리면 on, 내리면 off 를 정수 비트에 활용하면 비트가 1일 경우에는 on, 0일 경우에는 off를 나타냅니다. 즉, 하나의 비트는 말 그대로 1 bit의 크기를 가지고 있습니다. 그래서 int(4byte)는 32개의 상태를 저장할 수 있습니다. flag는 적은 공간에 정보를 저장하고 빠른 속도를 필요로 할 때 사용합니다. ex) CPU
• 특정 비트를 키는 방법 : flag |= mask
flag로 사용할 변수에 |= 연산자와 숫자를 사용해 특정비트를 킵니다. 여기서 flag의 비트를 조작하거나 검사할 때 사용하는 숫자를 마스크(mask)라고 부릅니다. flag 키는 동작은 비트 OR 연산 특성을 이용한 것으로 0 | 1 과 1 | 1 은 모두 1 이므로 flag의 비트가 꺼져있으면 키고, 켜져있으면 그대로 유지합니다.
flag의 특정 비트가 켜져 있는지 검사하려면 & 연산자를 사용해야 합니다.
여기서 해당 비트를 킬 때 사용하는 마스크들을 보면 공통점을 찾을 수 있습니다. 무엇일까요..? 힌트는 그전에 제가 작성했던 비트 연산자 응용하기를 보시면 알 수 있습니다.
정답은...... 바로 2의 거듭제곱만큼 수가 늘어난다는 점입니다!
최하위 비트를 0으로 잡고 숫자가 1씩 왼쪽으로 증가한다면 다음과 같은 모습이 되는데요.
보시다시피 128 → 64 → 32 → 16 → 8 → 4 → 2 → 1 처럼 나열되어 있습니다. 따라서 0000 0100 처럼 우측에서 세 번째 비트를 키고 싶다면 flag |= 4 형식으로 사용하면 됩니다.
그리고 본론으로 들어가 & 연산자는 두 비트가 모두 1 이어야 1 이므로 flag에 저장된 0000 1100과 & 연산해서 마스크 값이 나오면 비트가 켜져 있는 것이고, 0이 나오면 비트가 꺼져있는겁니다.
• 특정 비트 끄는 방법 : flag &= ~mask
마스크 값을 ~ 연산자로 비트를 뒤집은 뒤 &= 연산자를 사용해 특정 비트를 끕니다. 예시를 들어 더 자세히 설명드릴게요.
ex) 12(0000 1100)에서 우측에서 세 번째 비트(4) - 0000 0100를 뒤집으면 1111 1011이 됩니다. 여기서 두 비트 간 & 연산을 해주면 0000 1000(두 비트 모두 1일 경우에만 1)이 됩니다.
마지막으로 비트가 켜져있으면 끄고 꺼져있으면 키는 방법입니다.
• flag ^= mask
flag의 비트를 토글(toggle)하는 동작은 비트 XOR의 연산 특성을 활용한 것입니다. 두 비트가 다르면 1, 같으면 0이죠.
2. 연산자의 우선순위
수학과 마찬가지로 C언어에서도 다양한 연산자들끼리의 우선순위가 정해져있습니다. 제가 직접 사진자료로 보여드리고 싶다만,, 너무 많은 관계로 생략하겠습니다. 차피 필요할 때 찾아보면 되기 때문에 큰 상관은 없습니다. 대신 연산자의 계산 순서를 ( )(괄호)로 명확하게 나타내는 것이 가독성에 좋다는 것만 기억해주세요.
괄호를 사용한 계산 식 계산 순서는 다음과 같습니다.
1) 괄호를 사용한 연산자 2) 우선 순위가 높은 연산자 3) 결합 방향에 따라 순서대로 계산
+ 비트 XOR을 이용한 암호화
비트 XOR 연산자는 간단한 암호화에 사용됩니다.
평문인 100은 이진수로 1100 100 이고 암호키인 57은 이진수로 111 001 입니다.
여기서 toggle을 하게되면 1011 101(93)이 됩니다.