상세 컨텐츠

본문 제목

C언어를 배워보자 네번째 시간

본문

이번시간에 배우는것은 비트 연산자이다 전시간이 이미 배운것같긴한데 다시 소개되었다

이미 배운건지 아니면 새로 배운건지 햇갈리니까 집고 넘어가도록 한다

 

아새로 배우는것이 맞다 

 

전에 배웠던것은 논리 연산자이고

and는 &&

or은 || 이었다

 

과연 그때 배운것과 지금 배우는것은 어떤 차이가 있을까?

 

먼저 비트단위 AND이다

#include <stdio.h>
 
int main(void)
{
    int num1 = 15;
    int num2 = 20;
    int num3 = num1 & num2; // num3 변수등록, num3은 num1 & num2
    printf("AND 연산의 결과: %d \n", num3);
    return 0;
}

난 답이 1이 나올것으로 예상했다

c에서 0은 False그리고 0이 아닌다른것들은 True를 의미한다고 하지 않았었던가

그러니까 True and True이고 답은 1이 되는것이다

 

그러나 답은 4가 나왔다

 

비트 연산자의 이해

15는 이진수로 표현했을때 00001111

20은 이진수로 표현했을때 00010100

 

각자리수를 주어진 연산자를 이용해 계산하는방식이다

0 & 0 = 0

1 & 0 = 0

1 & 1 = 1

 

따라서 15 & 20 = 4가 되는것이다!

 

위의 코드에서 비트 연산자를 &(and)에서 |(or)로 바꿔준뒤 결과를 본다

#include <stdio.h>
 
int main(void)
{
    int num1 = 15;
    int num2 = 20;
    int num3 = num1 | num2; 
    printf("AND 연산의 결과: %d \n", num3);
    return 0;
}

 

새로운 연산자 등장 XOR

낯은 익지만 개념이 잘 기억이 안나 리마인드하는 좋은 기회가 될것같다

XOR: 두개의 비트가 서로 다른 경우에 1을 반환한다, 같은 경우에는 0을 반환함

C에서는 ^라는 기호로 이용할수있다

#include <stdio.h>
 
int main(void)
{
    int num1 = 15;
    int num2 = 20;
    int num3 = num1 ^ num2; 
    printf("AND 연산의 결과: %d \n", num3);
    return 0;
}

 

~연산자: 비트단위 NOT

~0 = 1

~1 = 0

#include <stdio.h>
 
int main(void)
{
    int num1 = 15;
    int num2 = ~num1;
    printf("NOT 연산의 결과: %d \n", num2);
    return 0;
}

해당하는 모든 비트를 뒤집는다

부호를 담당하는 부분도 바뀌어 양수는 음수 음수는 양수로 반전된다

 

<<연산자 비트의 왼쪽 이동

처음에 비트 연산자의 개념이 잡혀있지않았을때는 왼쪽이동, 오른쪽이동이 뭘까 햇는데

지금은 어느정도 예상이되었다

#include <stdio.h>
 
int main(void)
{
    int num = 15;
    int result1 = num<<1;
    int result2 = num <<2;
    int result3 = num <<3;

    printf("1칸 이동 결과: %d \n", result1);
    printf("2칸 이동 결과: %d \n", result2);
    printf("3칸 이동 결과: %d \n", result3);
}

이동으로 인해 새로 생겨날때의 비트는 0이 나온다

 

>>연산자 비트의 오른쪽 이동

앞서 말햇듯이 이동으로 인해 새로 생겨날때의 비트는 0이나오지만

이것은 상황에 따라 다르다

 

음의 부호를 가진비트가 오른쪽으로 이동을 하게 되면 그러면 부호가 바뀌는것일까?

 

책에서는 일부 cpu에서는 0으로 채워넣기도하고 어떤 cpu에서는 부호를 유지하기위해 1로 채운다고한다

그렇다면 직접 코드를실행해보자

#include <stdio.h>
 
int main(void)
{
    int num = -16;
  
    int result2 = num >>2;
    int result3 = num >>3;


    printf("2칸 이동 결과: %d \n", result2);
    printf("3칸 이동 결과: %d \n", result3);
}

책과 같은결과가 나왔다

-4

-2

맥의 cpu는 부호를 유지시켜주는것같다

관련글 더보기