본문 바로가기
PLC 자동제어 학습/아두이노 보드 수업

C언어에서 비트연산을 하는 이야기

by 인터넷떠돌이 2017. 11. 17.
반응형

안녕하세요?


어제 포스팅에서 언급을 했다시피, 비트 연산이라는 것이 상당히 낯선 것인데, 다른 포스팅 안에서 묻어가면서 설명하기에는 내용이 너무 길어서 이렇게 따로 떼어내서 포스팅을 하게 되었습니다. 막상 이렇게 포스팅을 떼어내면 얼마 안되는 것 같기도 하지만, 그래도 엄청나게 짧은 것은 아니기는 합니다.



지난번 포스팅에서 위 스크린샷에 나와 있는 것처럼, 아두이노의 통합 개발환경 IDE인 스케치에서 위와 같이 코딩을 하고서 아두이노 보드에 업로딩해서 아래와 같은 결과가 나왔습니다.



일단 이와 같은 결과가 왜 나왔는지 설명을 하기 위해서는 byte라는 변수에 대해서 먼저 설명을 해야만 하는 필요성이 있습니다. 일단 byte라고 변수를 선언하게 되면, 8비트(bit) 단위의 연산을 시작하게 됩니다. 그래서 모든 변수-특히 10진수의 수는 2진수의 수로 변환이 가능합니다.




그래서 먼저 AND라는 형식으로 나오는 &에 대해서 먼저 어떤 식으로 연산이 이루어 졌는지를 그림으로 그려서 설명을 해야 겠다는 생각이 듭니다.



위 그림을 보시면 먼저 9와 5는 8자리의 2진수로 변환이 되게 됩니다. 그리고 여기서 중요한 것은 비트연산이라는 것은 절대로 산수나 수학의 덧셈 뺄셈이 아니라는 것입니다. AND 이기 때문에 둘다 1일 때만 1이라는 값이 나오는 연산입니다. 그리고 비교가 되는 것은 2진수 수의 자리수가 같은 곳이 1이냐 0이냐 하는 것을 비교하는 것입니다.


9 = 0000 1001

5 = 0000 0101


이렇게 해서 같은 자리수에 위와 아래를 비교, 이전에 했었던 디지털 회로를 연결해서 0과 1의 결과를 만들어 냈던 것처럼 둘다 1일대만 1이라는 결과가 나옵니다. 그래서 위 그림을 보시면 제일 마지멕에는 1 하나만 나오고, 2진수를 10진수로 변경할 시에, 1이라는 결과만 나오게 되는 것입니다.



위 그림은 OR에 해당하는 | 의 결과입니다. 당연 위와 아래에 있는 2진수의 8자리 숫에서 둘중 하나라도 1이라면 1이라는 결과가 나오기 때문에, 맨 아래에 보시면 00001101이라고 나오고, 10의 진수로 변형시에 13이라는 결과가 나오게 되는 것입니다.




조금은 재미있다고 해야 할까요? ^는 승수라고만 할 수도 있으나 비트 연산자로서는 Exclusive OR이라고 해서, A와 B, 둘중 하나라도 다르면 1이라는 결과가 출력되는 비트 연산자라고 할 수 있습니다. 이 ^이 중요한 이유는 신호의 입,출력에 사용이 되는 그레이 코드를 2진수로 변환할 때 사용되는 것이 Exclusive OR인 것을 생각하면 정답이 나온다고 할 수 있습니다.



그래서 비트 연산자의 계산결과가 00001100이라고 하는 8자리의 2진수 숫자가 나오며, 스케치의 시리얼 모니터상에서 10진수로 변환되어 나와야 하기 때문에, 12라는 숫자가 표시가 되는 것입니다. 



다음은 X<<3이라는 것은 왼쪽으로 3번 shift라고 해서, 3칸이동이라고 해야 할까요? 1이라는 값을 왼쪽으로 3자리 강제로 이동시키라는 비트 연산자입니다. 그래서 위 그림에서 보시면 왼쪽으로 서서히 3번 이동하는 것이 나와 있으며, 자리수가 커진 만큼 숫자도 늘어나서 결과값이 상당히 커진것을 볼 수 있었습니다.




그런데 여기서 한가지 몇일 전에 했던 포스팅에서 CiMon이라는 Scada에서 지원하는 비주얼 베이직은 비트 연산을 하지 못한다는 내용을 들었습니다.


링크 : 워드 데이터와 비트 연산, 그리고 while문 활용의 예시



그래서 이번에는 >> 라고 우측으로 shift라고 해서 쉬프트에 대해서 연산을 했고, 결과물은 2가 나왔습니다. 여기서 한가지 나왔는 것이, 좌측으로 쉬프트를 할 경우에는 한번 쉬프트당 2씩 곱하고, 우측으로 쉬프트를 할 경우에는 2씩 나눈다는 것입니다. 생각해 보면 2진수에서는 자릿수가 하나 올라가면, 2를 곱하는 것이기 때문에, 사실상 2곱하고 2를 나눈다고 볼 수 있다는 생각이 듭니다.


다만 그런것을 고려해도 아직은 제가 능력이 모자라서 이러는 것일 까요? 지난번 포스팅에서 올렸는 비주얼 베이직 기반의 스크립트 코딩 내용이 아직은 이해가 되지 않기는 않는다는 생각이 듭니다.


반응형