비트 연산자
Bit(비트)란 정보를 저장하는 최소 단위이다. C언어에서는 비트를 다루는 연사자가 제공되는데, 바로 비트 연산자이다. 비트 연산자는 char, short, int, long 등
정수 데이터 타입에서 사용이 가능하다. 비트 연산자의 종류에는 다음과 같은 것들이 있다.
& (AND) 연산자
& 연산은 다음과 같이 대응되는 비트가 모두 1 이면 결과는 1 이 되고, 이외의 경우에는 0 이 된다.
0 & 0 => 0
0 & 1 => 0
1 & 0 => 0
1 & 1 => 1
예를 들어 아래의 그림처럼 a 변수에 '01000001' 이 저장되어 있고, b 변수에 '00111001' 이 저장되어 있으면 a&b 연산의 결과는 대응되는 비트가 1일 때만
1이 되어 00000001 이 된다.
아래의 프로그램은 변수 ch에 입력받은 내용의 가장 오른쪽 비트가 1인지 판단하는 프로그램이다.
08 행 : ch 변수에 a가 저장되면 a의 ASCII 값인 '01100001' 이 저장된다.
ch 변수에 b가 저장되면 b의 ASCII 값인 '01100010' 이 저장된다.
10 행 : 문자 a와 1을 (00000001)을 AND 연산하면 1이 된다.
문자 b와 1을 (00000001)을 AND 연산하면 0이 된다.
| (OR) 연산자
| 연산은 다음과 같이 대응되는 비트 중 하나라도 1이 있으면 결과는 1이 되고, 둘 다 0인 경우에는 0이 된다. (논리 연산자의 OR와 비슷)
0 | 0 => 0
0 | 1 => 1
1 | 0 => 1
1 | 1 => 1
변수 a에 '01000001' 이 저장되어 있고 b에 '00111001' 이 저장되어 있으면 이를 | 연산한 결과는 '01111001' 이 된다.
아래의 프로그램은 변수 a의 오른쪽에서 4번째 비트를 1로 만드는 프로그램이다.
10 행 : 변수 a의 값과 8 (이진수 : 00001000)를 OR 연산한다.
8과 8를 OR 연산한 값이 8인건 당연하지만, 7과 8를 | 연산한 값이 왜 15인지 이해가 가질 않는다면 아래 그림을 보면 된다.
^ (XOR) 연산자
^ 연산자는 다음과 같이 대응되는 비트가 서로 같으면 결과는 0이 되고, 다르면 1이 된다.
0 ^ 0 => 0
0 ^ 1 => 1
1 ^ 0 => 1
1 ^ 1 => 0
변수 a에 '01000001' 이 저장되어 있고 b에 '00111001' 이 저장되어 있을 때 ^ 연산의 결과는 '01111000' 이 된다.
아래의 프로그램은 a와 b의 가장 오른쪽 비트가 일치하는지 판별하는 프로그램이다.
10, 11 행 : a와 b에 저장된 내용을 제일 오른쪽 비트를 제외하고 모두 0으로 만든다.
13 행 : 10~11 행에서 얻은 a,b를 가지고 비교한다.
a를 제일 오른쪽을 제외하고 모두 0으로 채우면 1 이 된다. //변수 a
c를 제일 오른쪽을 제외하고 모두 0으로 채우면 1 이 된다. //변수 b
따라서 변수 a,b를 비교하면 같기 때문에 0 이 출력된다.
a를 제일 오른쪽을 제외하고 모두 0으로 채우면 0 이 된다. //변수 a
b를 제일 오른쪽을 제외하고 모두 0으로 채우면 0 이 된다. //변수 b
따라서 변수 a,b를 비교하면 같지 않기 때문에 1 이 출력된다.
~ (NOT) 연산자
~ 연산은 다음과 같이 0이면 결과는 1이 되고, 1이면 0이 된다.
변수 a에 '01000001' 이 저장되어 있으면 ~a는 '10111110' 이 된다.
아래의 프로그램은 변수 a에 저장된 내용에서 오른쪽 3개의 비트를 0으로 만드는 프로그램이다.
10 행 : 우선 7을 이진수로 나타내면 '00000111' 이 되고 이걸 ~ 연산하면 '11111000' 이 되기 때문에 ~7과 a를 AND 연산하면 끝 3자리는 0으로 세팅된다.
<< (왼쪽 시프트) 연산자
<< 연산의 사용 형식은 다음과 같은데, 데이터를 왼쪽으로 비트수만큼 이동시킨다.
이를 활용한 프로그램은 다음과 같다.
10 행 : a에 7('0000111') 이 저장되어 있다고 가정하면 a<<1은 00001110 이 되어 14가 출력된다.
즉, << 연산자를 이용하여 왼쪽으로 1비트씩 이동시키면 2를 곱한 값이 된다.
>> 연산자
>> 연산자의 경우 오른쪽으로 1비트씩 이동시시켠 2를 나눈 값(몫만 취함, 11>>1 = 5)이 되는것 이외에는 << 연산자와 개념이 비슷하기 때에 포스팅 하지 않았습니다.