비트 연산자는 바이트 단위보다 더 작은 비트 단위로 연산하는 연산자이다.
BIT는 2진수를 저장하는 단위이고, 컴퓨터에서 사용할 수 있는 최소 단위이며, 0과 1을 나타낸다.
Byte는 8비트 크기의 단위이다.
비트 연산자의 종류는 아래와 같다.
& : 비트 AND
| : 비트 OR
^ : 비트 XOR (배타적 OR, Exclusive OR)
~ : 비트 NOT
<< : 비트를 왼쪽으로 시프트
>> : 비트를 오른쪽으로 시프트
&= : 비트 AND 연산 후 할당
|= 비트 OR 연산 후 할당
^= : 비트 XOR 연산 후 할당
<<= : 비트를 왼쪽으로 시프트 한 후 할당
>>= : 비트를 오른쪽으로 시프트 한 후 할당
비트 연산자는 비트로 옵션을 설정할 때 주로 사용하며
저장공간을 아낄 수 있는 장점이 있다!
이런 방식을 flag 라고 부른다.
※ 배타적 OR은 처음보는 개념이다. 입력값이 같지 않으면 true를 출력한다고 한다.
언젠가는 쓰일 개념이라 잘 외워둬야 하겠지만...! 일단은 책만 따라가자.

개념을 이해하는 것이 재미있다!
일단 char의 크기가 1바이트이므로 8개의 비트가 있다.
따라서 num1은 8개의 비트에 십진수 1을 이진수로 변환한 값을 갖는다.
num2은 8개의 비트에 십진수 3을 이진수로 변환한 값을 갖는다.
num1 : 0000 0001
num2 : 0000 0011
여기서 &, |, ^는 비트 연산자이므로
비트 단위로 연산을 하게 된다.
각각 매치되는 값끼리 연산이 되므로
AND에서는 0000 0001
OR에서는 0000 0011
XOR에서는 0000 0010 으로 연산이 된다. (배타적 OR이라 입력값이 같으면 false이다.)
이를 십진수로 변환하면
1, 3, 2 이므로 이 값들이 출력되었다.

논리학에서 ~는 부정을 뜻한다.
참과 거짓의 논리값을 반대로 바꿔주는 역할을 한다.
여기서도 비슷하다.
해당 값에 비트연산자 ~를 넣는다면 모든 비트의 0과 1이 바뀐다.
이를 비트 반전이라고 한다.

시프트 연산자를 활용해보았다.
비트의 이동에 따라 값이 바뀐다.
a >> b : a 비트값을 오른쪽으로 b번 옮긴다.
a << b : a 비트값을 왼쪽으로 b번 옮긴다.
옮기면서 모자라는 공간은 0으로 채운다.
이진수에 따르면
3 << 3은 3 * 2^3과 같고
24 >> 2는 24 / 2^2와 같다.
따라서 시프트연산 <<는 2의 거듭제곱을 곱한 것이고
시프트 연산 >>는 2의 거듭제곱을 나눈 것이다.

연산 후 할당을 하면 기존에 들어있던 값은 사라지고 새로 연산한 값이 할당된다.
이 연산을 풀어보면
num1 = num1 & 5;
num2 = num2 | 2;
num3 = num3 ^ 3;
num4 = num4 << 2;
num5 = num5 >> 2; 와 같다.
특히 비트연산에서 연산과 할당이 한꺼번에 이루어지는 연산자는 플래그를 켜거나 끌 떄 유용하게 활용된다는데
아직 플래그가 뭔 지 모른다.




'C, C++' 카테고리의 다른 글
C언어 코딩도장(switch 분기문) (0) | 2022.04.27 |
---|---|
C언어 코딩도장(비트 연산자 응용하기 / 플래그) (0) | 2022.04.26 |
오늘 공부한 C언어(불 자료형 사용하기) (0) | 2022.03.09 |
오늘 공부한 C언어(논리 연산자 사용하기) (0) | 2022.03.06 |
오늘 공부한 C언어(비교 연산자와 삼항 연산자 사용하기) (0) | 2022.03.06 |
비트 연산자는 바이트 단위보다 더 작은 비트 단위로 연산하는 연산자이다.
BIT는 2진수를 저장하는 단위이고, 컴퓨터에서 사용할 수 있는 최소 단위이며, 0과 1을 나타낸다.
Byte는 8비트 크기의 단위이다.
비트 연산자의 종류는 아래와 같다.
& : 비트 AND
| : 비트 OR
^ : 비트 XOR (배타적 OR, Exclusive OR)
~ : 비트 NOT
<< : 비트를 왼쪽으로 시프트
>> : 비트를 오른쪽으로 시프트
&= : 비트 AND 연산 후 할당
|= 비트 OR 연산 후 할당
^= : 비트 XOR 연산 후 할당
<<= : 비트를 왼쪽으로 시프트 한 후 할당
>>= : 비트를 오른쪽으로 시프트 한 후 할당
비트 연산자는 비트로 옵션을 설정할 때 주로 사용하며
저장공간을 아낄 수 있는 장점이 있다!
이런 방식을 flag 라고 부른다.
※ 배타적 OR은 처음보는 개념이다. 입력값이 같지 않으면 true를 출력한다고 한다.
언젠가는 쓰일 개념이라 잘 외워둬야 하겠지만...! 일단은 책만 따라가자.

개념을 이해하는 것이 재미있다!
일단 char의 크기가 1바이트이므로 8개의 비트가 있다.
따라서 num1은 8개의 비트에 십진수 1을 이진수로 변환한 값을 갖는다.
num2은 8개의 비트에 십진수 3을 이진수로 변환한 값을 갖는다.
num1 : 0000 0001
num2 : 0000 0011
여기서 &, |, ^는 비트 연산자이므로
비트 단위로 연산을 하게 된다.
각각 매치되는 값끼리 연산이 되므로
AND에서는 0000 0001
OR에서는 0000 0011
XOR에서는 0000 0010 으로 연산이 된다. (배타적 OR이라 입력값이 같으면 false이다.)
이를 십진수로 변환하면
1, 3, 2 이므로 이 값들이 출력되었다.

논리학에서 ~는 부정을 뜻한다.
참과 거짓의 논리값을 반대로 바꿔주는 역할을 한다.
여기서도 비슷하다.
해당 값에 비트연산자 ~를 넣는다면 모든 비트의 0과 1이 바뀐다.
이를 비트 반전이라고 한다.

시프트 연산자를 활용해보았다.
비트의 이동에 따라 값이 바뀐다.
a >> b : a 비트값을 오른쪽으로 b번 옮긴다.
a << b : a 비트값을 왼쪽으로 b번 옮긴다.
옮기면서 모자라는 공간은 0으로 채운다.
이진수에 따르면
3 << 3은 3 * 2^3과 같고
24 >> 2는 24 / 2^2와 같다.
따라서 시프트연산 <<는 2의 거듭제곱을 곱한 것이고
시프트 연산 >>는 2의 거듭제곱을 나눈 것이다.

연산 후 할당을 하면 기존에 들어있던 값은 사라지고 새로 연산한 값이 할당된다.
이 연산을 풀어보면
num1 = num1 & 5;
num2 = num2 | 2;
num3 = num3 ^ 3;
num4 = num4 << 2;
num5 = num5 >> 2; 와 같다.
특히 비트연산에서 연산과 할당이 한꺼번에 이루어지는 연산자는 플래그를 켜거나 끌 떄 유용하게 활용된다는데
아직 플래그가 뭔 지 모른다.




'C, C++' 카테고리의 다른 글
C언어 코딩도장(switch 분기문) (0) | 2022.04.27 |
---|---|
C언어 코딩도장(비트 연산자 응용하기 / 플래그) (0) | 2022.04.26 |
오늘 공부한 C언어(불 자료형 사용하기) (0) | 2022.03.09 |
오늘 공부한 C언어(논리 연산자 사용하기) (0) | 2022.03.06 |
오늘 공부한 C언어(비교 연산자와 삼항 연산자 사용하기) (0) | 2022.03.06 |