[c언어 기초]

우리가 아는 C언어

[c언어 기초] 우리가 아는 C언어

연산자(비트)

비트 연산자에 대해서

비트 연산자

비트 연산자는 피연산자를 10진수나 16진수나 8진수와 같은 숫자가 아니라, 32비트(0과 1)의 집합으로 표현하는 연산자 입니다.또한 비트 연산자를 사용할 경우 프로그램의 용량을 매우 많이 줄일 수 있으며 속도 또한 증가한다는 장점이 있습니다.
그리고 비트 단위 연산자는 2진수 형태의 비트 자리별로 논리연산 하며 비트 연산자를 이해하려면 10진수와 2진수를 서로 바꿀 수 있어야 합니다.
 
10진수를 2진수로 바꾸기
 
10진수인 32를 2진수로 바꾸어 봅시다.
32을 2로 나누었을때 나오는 나머지들을 아래에서 위로 순서대로 써 올리면 2진수가 나옵니다.
이렇게 32를 2진수로 바꾸면 011010이 됩니다.(예시: 11을 2진수로 바꿀시 1011이 나옵니다.)
 

 2진수를 10진수로 바꾸기

이진수인 '00011010'을 10진수로 바꾸어 봅시다.
이진수를 나열하고 그 위에 뒤에서 부터 차례대로 2의 제곱수를 똑같이 나열한후 위아래로 곱해준 값을 더해줍니다.
이렇게 00011010를 10진수로 바꾸면 26됩니다.(예시: 00001011을 2진수로 바꿀시 11이 나옵니다.)
 
이제 비트 연산자에 대해 배워봅시다.

 아래의 코드를 직접 작성하고 실행해 봅시다.

#include <stdio.h> 
main () 
{ 
printf ( "%d %d \n", 3 & 1, 3 | 1); 
printf ( "%d \n", 3 ^ 1); 
printf ( "%d %d \n", 3 << 1, 3 >> 1); 
}

실행결과

위 프로그램을 실행하면 숫자데이터를 2진수로 변환한 후 비트별로 논리연산을 실행한 결과를 출력합니다.

 
  • 4행에서 비트 연산자 '&' 와 ' | ' 는 각각 논리곱논리합 연산을 비트 단위로 수행합니다. 따라서 3의 비트 값 11과 1의 비트 값 01의 논리곱을 비트 단위로 수행한 결과 1(이진수는01)을 출력하게 되고 같은 방식으로 비트 논리합 연산의 결과는 3(이진수는 11)이 출력됩니다.
  • 5행에서 비트 연산자 '^' 은 배타적 논리합 연산을 비트 단위로 수행합니다. 배타적 논리합 연산은 두 비트의 값이 다를 때만 참(1)이 되는 연산 이므로, 연산 결과는 2가 됩니다.
  • 6행에서'<<'와 '>>'은 비트 열을 일정 길이 만큼 이동시키는 시프트 연산자 입니다.

논리곱(AND, &)

두 값의 각 자릿수를 비교해, 두 값 모두에 1이 있을 때에만 1을, 나머지 경우에는 0을 계산합니다.
(예시: 1100(12)과 1010(10)을 비교할때, 1000(8)이 된다. )

 
논리합(OR, |)
두 값의 각 자릿수를 비교해, 둘 중 하나라도 1이 있다면 1을, 아니면 0을 계산합니다.
(예시: 1100(12)과 1010(10)을 비교할때 1110(14)이 된다. )
 
배타적 논리합(XOR, ^)
두 값의 각 자릿수를 비교해,값이 0으로 같으면 0, 값이 1로 같아도 0, 다르면 1을 계산합니다.
(예시: 1100(12)과 1010(“10)을 비교할때 0110(6)이 된다.)
 
쉬프트(shift, << or >>)
대상의 값을 2진 비트로 바꾼 후에 특정 비트 수만큼 이동 시키고 빈자리는 0으로 채우는 연산자입니다.
3<<1은 정수3을 1비트 만큼 왼쪽으로 이동시키며, 3>>1은 정수3을 1비트만큼 오른쪽으로 이동시킵니다.
(예시)
3<<1은 3(11)이 왼쪽으로 1비트만큼 이동하므로 6(110)이 되며,
3>>1은 3(11)이 오른쪽으로 1비트만큼 이동시키므로 1(01)이 되며 1의 자리 이하의 숫자는 절삭됩니다. 

 정리

비트 연산자의 쓰임

다음 토픽에선 비트 연산자인'~'와 보수 그리고 삼항연산자에 대해 알아봅시다!

 

댓글

댓글 본문
  1. 홍승열
    감사합니다.
    두번째 10진수에서 2진수로 바꾸기에서 10진수 32가 아닌 26을 2진수로 바꾸면 011010 이 되는 것 같습니다.
  2. life knowledge
    일반적으로 이진수는 짝수 자리로 나타내기때문에 011010로 써주지만 맨앞이 0인 경우는 생략 해줘도 상관없습니다.^^
    대화보기
    • Noir
      26을 2진수로 바꾸었을 때 11010이 아니라 011010이 되는 이유는 무었인가요? 앞에 0이 왜 붙는거죠?
    • 호두
      고맙습니다.
    버전 관리
    life knowledge
    현재 버전
    선택 버전
    graphittie 자세히 보기