C/C++ 공부하기 #2 비트 연산자, 비트 이동(Shift) 연산자

Explanation

지난 글에 이어서 이번 글은 비트 연산자와 비트 이동(시프트) 연산자 입니다.

1. & 연산자

& 연산자는 두개의 비트가 모두 1일 때 1을 반환하는 연산입니다.
예를 들어 0 – 0 이면 0이고 0 – 1 이거나 1 – 0 이어도 0 입니다.

1-1. 예제

지난 글에서 적었듯 정수는 4바이트로 표현합니다.
그리고 4와 8은 같은 위치에서 1인 비트가 없기 때문에 출력하는 값은 0입니다.

1-2. 예제

둘의 & 연산 결과는 00000000 00000000 00000000 00000001 이기 때문에 출력값은 1입니다.

2. | 연산자

| 연산자는 두개의 비트중 하나라도 1이라면 1을 반환합니다.
예를 들어 0 – 0 이면 0이고 0 – 1 이거나 1 – 0, 1 – 1 이면 1 입니다.

2-1. 예제

| 연산 결과는 00000000 00000000 00000000 00000101 이기 때문에 출력값은 5입니다.

3. ^ 연산자

^ 연산자는 두개의 비트가 다를 경우 1를 반환합니다.
예를 들어 0 – 0 이거나 1 – 1 이면 0이고 0 – 1 이거나 1 – 0 이면 1 입니다.

3-1. 예제

^ 연산 결과는 00000000 00000000 00000000 00001000 이기 때문에 출력값은 8입니다.

4. ~ 연산자 (비트단위 NOT)

~ 연산자는 0에서 1로 1은 0으로 반전시키는 연산으로 보수 연산이라고도 불린다고 합니다.
한가지 추가로 생각하는 부분은 왼쪽 첫번째에 위치한 부호비트(MSB)도 반전 된답니다.

4-1. 예제

15의 비트의 0은 1로 1은 0으로 바꾸면 11111111 11111111 11111111 11110000 가 되겠죠? 그런데 첫번째 부호비트(MBS)가 1로 음수이기 때문에 이 값은 2의 보수를 취해 알 수 있습니다.
2의 보수를 구하면 00000000 00000000 00000000 00010000 가 나오고 이는 16입니다. 그렇게 하여 11111111 11111111 11111111 11110000는 -16 라는 것을 알 수 있습니다.

5. << 연산자 (왼쪽 Shift)

5-1. 예제

위 예제를 보면 알 수 있듯이 << 연산자 뒤에 나오는 숫자만큼 비트가 왼쪽으로 이동하고 가장 오른쪽은 0으로 채워집니다. 그리고 왼쪽으로 1칸 이동할때마다 정수의 값은 2배로 커지고 역으로 오른쪽으로 1칸 이동할때마다 정수의 값은 반이 된다는 것을 알 수 있습니다.

그리고, 기다리고 기다리던 CPU에 관한 이야기.
상황에 따라 곱샘과 나눗샘은 비트의 이동 연산으로 구할 수 있고 이는 성능 향상으로 이어집니다. (CPU 입장에서는 곱셈과 나눗샘이 비트 이동보다 부담스러운 연산이기 때문에)

자바스크립트로 예를 들자면 이렇겠네요.

6. >> 연산자 (오른쪽 Shift)

6-1. 예제

위 예제를 보면 알 수 있듯이 >> 연산자 뒤에 나오는 숫자만큼 비트가 오른으로 이동합니다. 그리고 (양수일 때) 가장 왼쪽의 비트는 0으로 채워집니다.

그리고, 여기서 다시 한번 기다리고 기다리던 CPU에 관한 이야기.
책의 이야기에 따르면, 양수 일때는 비트가 오른쪽으로 한칸 이동할때마다 가장 왼쪽 비트에 0이 채워지지만 음수 일때는 CPU에 따라서 왼쪽에 비트를 0으로 채우기도, 1로 채우기도 한다고 합니다.

저의 컴퓨터에서는 출력값이 -8, -4, -2로 부호비트를 유지하는 시스템이네요. 그렇다면 오른쪽 시프트를 하면 왼쪽 비트에 1이 채워진다는 것을 알 수 있습니다.

근데.. 사실 아직 완전히 이해한건 아니에요. 오른쪽 시프트틑 할 때 왼쪽에 0이 채워지는 경우라면, 값의 부호도 바뀌고 값이 많이 달라지게 될 것 같은데, 그러면 앞에서 너무 당연한 듯 정수는 오른쪽 시프트를 한칸 할때마다 값은 2로 나누어진 값이 된다고 했는데. 이 또한 CPU에 따라서 제한적인 사항이겠군요?…
음… 이 부분은 조금 더 검색을 하고 알아봐야 할 거 같아요. 하지만 지금은 시간이 너무 늦어서 다음에 추가하는 것으로…

혹시 이 부분에 대해 잘 아시는 분이 댓글로 설명해주시면 참 감사할 거 같아요 :)

Leave a Reply

  1. sofkaints

    웹앱에서 본인인증을해야 캘린더 정보를 볼수 있는데
    퀵스타터는 실행하면 주는 url접속후 인증하고 뱉어내는 code를 입력해야 정보가 나옵니다.
    다른 유저가 이 기능을 쓰려면 어떻게 해야하죠?
    url을 클라한테 보내줘서 인증하게 해야하나요?

    간단히 말해 응용방법을 모르겠습니다 ㅠ

    • 안녕하세요, sofkaints님.
      실제로 서비스에서 사용하시려면 몇가지 수정이 필요할 것 같습니다. sofkaints님이 말씀하신 것처럼 구글 사용자 인증을 위해서 (문서상 변수)’authUrl’로 클라이언트에서 새로 페이지를 띄우거나 리다이렉션 시켜서 사용자가 인증절차를 걸칠 수 있게 해야 합니다. 그리고 인증이 완료되면 구글 API 프로젝트에서 사용자 인증에서 ‘승인된 리디렉션 URI’부분에 등록된 URI로 리다이렉션이 되는데 이때 스트링 파라미터로 ?code=… 라는 값이 함께 옵니다.
      ‘승인된 리디렉션 URI’에 등록된 URI의 로직에서는 스트링 파라미터로 code가 있는지 확인하고, 있다면 code를 이용해서 ‘getToken’ 하여 토큰을 만들어서 ‘storeToken’ 토큰을 등록하고 다음 이벤트 로직을 실행하면 됩니다.
      짧게 글로만 적으려니, 더 복잡하게 느껴지는거 같네요. 조금이나마 도움이 되었을지 모르겠습니다…
      댓글 감사합니다 :)

  2. 잘봤습니다!!

    글 정말 잘봤습니다 근데… 한대로 그대로 따라했는데
    Error: ENOENT: no such file or directory, mkdir

    이런오류가 계속 나네요.. 혹시 왜그런지 아세요 ?ㅠㅠ

    • 안녕하세요? 댓글 확인이 늦었네요.
      파일이나 디렉토리를 찾을 수 없다는 것으로 보아, 예제에서 디렉토리 파일을 읽어오는 부분.
      ‘ var TOKEN_DIR= ‘ 토큰을 저장할 디렉토리를 선언하는 부분이나
      ‘ client_secret.json ‘ 파일의 위치에서 문제가 생긴게 아닐까 싶습니다.
      ‘client_secret.json’ 파일을 올바른 디렉토리에 넣었는지, 또는 파일 디렉토리 경로를 수정하시거나
      생성하신 서버의 환경에 맞게 토큰을 저장할 디렉토리(‘TOKEN_DIR’)를 새로 지정하시면 되지 않을까 싶습니다.