본문 바로가기
[ CODING STUDY ]/》C언어 공부

C언어 9장(비트연산자)

by MRG 2020. 4. 24.
728x90
반응형

▣ 안녕하세요. 저번장 숙제해보셨나요??
저번장에서 랜덤에 관해서 배웠습니다.
조금 어려웠지만 그래도 꼭 해보셨을 거라 생각하고 넘어가겠습니다. ^^



오늘은 비트 연산자에 대해 배워보겠습니다.
비트 연산자는 비트단위로 연산하는 연산자를 이야기합니다.



▣ 비트(bit)는 2진수를 저장하는 단위입니다.
우리가 자료형에 대해 공부하면서 비트에 대해 이야기 잠깐 했었죠?
컴퓨터에서 사용할 수 있는 최소에 단위라고 생각하시면 될꺼같습니다.
8bit가 모이면 1byte라고 우리는 배웠습니다.



▣ 우리는 쉽게 우리에 연산 방법으로 컴퓨터한테 명령을 주면 연산 결과가 쉽게 나오게 됩니다.
그런데 왜 비트 연산 자라는 걸 사용할까요?
이 부분을 조금 알고 가야 비트 연산자를 공부하는데 도움이 되실 거라 생각합니다. 나중을 위해서요.



쉽게 이야기하면 컴퓨터는 결국 2진수로 받아들이고 연산합니다. 
우리가 주는 명령 또한 2진수로 번역해서 컴퓨터한테 전달해주고 그걸 컴퓨터가 연산하겠죠?



그럼 우리가 비트 연산자로 연산을 한다면 어떻게 될까요?



네 맞습니다. 생각하시는 것처럼 연산속도가 빨라지겠죠?



그 이유는 비트라는 최소 단위로 정보를 바로바로 주기 때문에 중간과정이 생략되고 빠르게 연산을 할 겁니다. 
그리고 제어 부분에서도 비트 연산을 응용하면 우리에게는 복잡하지만 비교적 짧은 코딩으로 연산이 가능하고, 최소 단위 비트를 사용하기 때문에 int나 long 같은 여러 자료형을 사용하지 않아 메모리 최적화 부분에서도 큰 장점이 됩니다. 



▣ 이 부분은 코딩을 많이 하다 보면 내공이 쌓이고 활용하게 됩니다. 저도 알고는 있지만 코딩이 복잡해질 수도 있어서 조금 안 쓰는 편이긴 합니다.
하지만 코딩을 깊이 공부해서 더 깊은 프로그램을 만들고 싶으신 분은 꼭 숙지하시면 좋을 거 같습니다.

 

▣ 비트 연산자는 이렇게 여러 연산자가 있습니다. 코딩을 해보고 하나하나 알아보도록 하겠습니다. 
먼저 결과를 살펴보겠습니다.

 

▣ 이런 결과가 나오네요.
그럼 이제 하나하나 살펴보겠습니다.
먼저 2진수에 대해서 좀 이해하실 필요가 있습니다. 잠깐 제가 언급은 했지만 자세하게 다루지 않아 조금 더 다뤄보도록 하겠습니다.
2진수가 무엇일까요? 
네 간단하게 이야기하면 0과 1로만 표현하는 숫자를 의미합니다.
그럼 10진수는 멀까요? 네 0부터 9까지 숫자로 표현하는 숫자들을 의미하겠죠?
그럼 10진수라는 숫자를 2진수로 한번 바꿔보는 걸 해보겠습니다.

 



▣ 자 먼저 11이라는 10진수에 숫자를 2진수로 바꿔보겠습니다. 
2진수로 바꾸려면 이렇게 나누기를 진행하시면 됩니다.
그런 다음에 나눈 나머지들을 저렇게 반대로 이어서 숫자를 만들어주시면 

이렇게 11에 2진수가 만들어집니다. 이걸 다시 10진수로 바꿀려면

 

2에 승을 더하면 됩니다.
오른쪽 맨 끝부터 2에 0승 , 2에 1승, 2에 2승, 2에 3승, 2에 4승 이렇게 되겠죠?
그럼 2진수에서 1인 숫자 부분만 더해주면 다시 10진수로 저렇게 바꿀 수 있습니다.

▣ 자 그럼 비트 연산자를 다시 살펴보겠습니다.

 

▣ 이렇게 비트연산자 종류들이 있습니다.
&(AND) 연산자입니다. 두 개의 비트가 1(참)일 경우에만 1(참)으로 연산해주게 됩니다.



|(OR) 연산자는 shift를 누르고 \표시단축키를 누르면 나오게 됩니다.
|(OR)연산자는 둘 중에 하나라도 1(참)이면 1(참)이고 둘 다 1(참)어도 1(참)입니다.



^(XOR)입니다. 이건 두 개에 비트에 값이 다를 때만 1(참)으로 연산합니다. 

 

▣ 그래서 아까 6 & 10을 했을 때 둘 다 2진수로 바꿔서 저렇게 하나하나 비교해서 연산을 합니다.
&(AND) 연산은 둘 다 1(참)인 경우만 1을 주니깐 저렇게 0000 0010(2진수) 결과가 나오게 됩니다.
그럼 저걸 다시 10진수로 바꾸면 2가 되기 때문에 결과가 2가 나옵니다. 

 

▣ |(OR) 연산자도 아까 위에서 설명한 것처럼 둘 중에 하나라도 1(참)일 경우와 둘다 1(참)일 경우가 1(참)으로 연산하기 때문에 1110으로 연산결과가 나오게 됩니다. 그래서 1110 == 14에 결과가 나오게 되는 것입니다.

 

▣ 이건 둘이 같지 않을 경우에만 1(참)으로 연산하기 때문에 1100으로 결과가 나오고 12에 결과가 나옵니다. 

 

▣ << 시프트라고 부릅니다.
이건 표시 그대로 왼쪽으로 가는 걸 의미하고 2는 2칸 가라라는 의미라고 생각하시면 될꺼같습니다.
그럼 저렇게 2칸을 움직이게 되면 0001 1000으로 연산 결과가 나와 이걸 10진수로 바꿔주면 24라는 결과가 나오게 됩니다. 이걸 사용하면 컴퓨터가 곱하기를 어떻게 하는지 알 수 있습니다. 이런 형식으로 컴퓨터는 곱하기를 진행합니다.

 

▣ >>반대로도 마찬가지로 저렇게 2칸을 뒤로 가게 되면 뒤에 비트 값이 생겨나는 게 아니라 8비트 기준으로 연산이 되어서 뒤에 부분을 사라지게 됩니다. 그래서 0000 0010으로 결과가 나와 2라는 10진수가 나오게 됩니다. 

 

▣ 이렇게 비트 연산자로 할당해서 할 수도 있습니다.
우리가 예전에 보았던 것처럼 복합 연산자랑 같다고 생각하시면 될꺼같습니다.
우선순위가 높은 &(AND) 비트 연산자를 먼저 진행하고 그다음에 연산 우선순위가 낮은 =(대입 연산자)를 연산합니다. 그래서 저런 결과가 나오게 됩니다.


▣ 이렇게 |(OR), ^(XOR), <<, >> 모두 할당 비트 연산자로 사용할 수 있습니다. 



▣ 오늘 이렇게 좀 복잡하고 어려운 비트 연산자를 배워보았습니다.
좀 많이 헷갈리고 어렵지만 나중에 메모리를 관리하거나 빠른 연산 그리고 최적 화적인 부분을 생각하시면 꼭 이 부분은 직접 손으로 계산을 해보시면서 이해하시면 좋을 거 같습니다.
저도 공부할 때 좀 어려웠습니다. 차분하게 꼼꼼하게 읽어주시고 연산해보세요.
숙제는 2진수를 10진수로 10진수를 2진수로 바꾸는 연산을 꼭 한번 해보시고,
저 위에 있는 연산들을 꼭 한 번씩 사용해보셔서 어떤 원리이고 어떻게 사용할지를 연구하시는 게 이번 숙제입니다. 
꼭 해보세요. 그리고
매 장마다 말씀드리지만 제 블로그로 공부가 끝나면 안 됩니다.
꼭 더 좋은 자료와 영상들을 보시면서 코딩 공부를 하셔야 합니다. 그래야 더 빠르고 정확하게 실력이 향상됩니다. 
그리고 혹시 궁금하신 사항이나 질문 있으시면 댓글 남겨주시면 제가 빠르게 답 드리겠습니다.
그럼 다음장에서 뵙겠습니다. 



▣ 포기하지 마세요!!! 저도 했습니다.!!! 파이팅

728x90
반응형

댓글