cCcode

C Language [핵심정리] - 9 본문

C Language Basic

C Language [핵심정리] - 9

cCcode 2021. 5. 14. 00:28

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 | 11 | 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

비트 토글(toggle)하는 방법

flag의 비트를 토글(toggle)하는 동작비트 XOR의 연산 특성을 활용한 것입니다. 두 비트가 다르면 1, 같으면 0이죠.

비트 토글 예시
결과

 

2. 연산자의 우선순위

수학과 마찬가지로 C언어에서도 다양한 연산자들끼리의 우선순위가 정해져있습니다. 제가 직접 사진자료로 보여드리고 싶다만,, 너무 많은 관계로 생략하겠습니다. 차피 필요할 때 찾아보면 되기 때문에 큰 상관은 없습니다. 대신 연산자의 계산 순서( )(괄호)명확하게 나타내는 것이 가독성에 좋다는 것만 기억해주세요.

 

괄호를 사용한 계산 식 계산 순서는 다음과 같습니다.

1) 괄호를 사용한 연산자 2) 우선 순위가 높은 연산자 3) 결합 방향에 따라 순서대로 계산

 

+ 비트 XOR을 이용한 암호화

비트 XOR 연산자는 간단한 암호화에 사용됩니다.

암호화와 복호화
결과

평문인 100은 이진수로 1100 100 이고 암호키인 57은 이진수로 111 001 입니다.

여기서 toggle을 하게되면 1011 101(93)이 됩니다.

'C Language Basic' 카테고리의 다른 글

C Language [핵심정리] - 11  (0) 2021.05.15
C Language [핵심정리] - 10  (0) 2021.05.14
C Language [핵심정리] - 8  (0) 2021.05.13
C Language [핵심정리] - 7  (0) 2021.05.11
C Language [핵심정리] - 6  (0) 2021.05.10
Comments