CreatorB18
1k
2019-05-16 10:04:27 작성 2019-05-16 12:03:08 수정됨
8
170

비트 이동 연산자의 left 이동 원리에 대해 질문드립니다.




아래의 코드는 이클립스 .java에서 컴파일 실행결과를 나타낸것입니다. 


int num = 3; // 0000 0000 / 0000 0000 / 0000 0000 / 0000 0011 2진수로 이렇게 알고 있습니다. 

num = num  << 31;

printf("%d", num);  // 음수가 출력이 됩니다. 

// 출력의 결과는 1000 0000 / 0000 0000 / 0000 0000 / 0000 0000와 같습니다.


num = 3;

num = num << 32; //  0000 0000 / 0000 0000 / 0000 0000 / 0000 0011

printf("%d", num); // 버려져서 0이 출력이 되는 것이 아니고, 양수 3이 출력이 됩니다.


num = 3;

num = num << 33; // 0000 0000 / 0000 0000 / 0000 0000 / 0000 0110

printf("%d", num); // 6이 출력이 됩니다.


직접 실험해본 바로는

다음과 같습니다.  그 원리가 궁금합니다.


책에서 배운대로라면 int형이면 33자리부터 이동연산을 사용하면 소멸해버린다고 생각하고있었고 책에서는 그내용이 나오지않아서 질문드립니다!

0
0
  • 답변 8

  • curioustore
    1k
    2019-05-16 11:42:45

    혹시 자바인가요?

    0
  • 현진건
    239
    2019-05-16 11:50:36

    첫번째는 10...01이 아니라 10...00입니다


    두, 세번째는 

    shift 연산에서는 그대로의 값으로 시프트 하는 것이 아니라 나머지 연산(%)의 결과값으로 시프트를 해서 그렇습니다.

    즉 num << 32이면 32%32 = 0이라서 num << 0과 같은 결과나 오는 것입니다.

    num << 33도 마찬가지로 33%32 = 1이라 num << 1과 같은 결과가 나온 것입니다.

    0
  • CreatorB18
    1k
    2019-05-16 12:00:22

    To. curioustore

    네 자바입니다.

    0
  • curioustore
    1k
    2019-05-16 12:01:04
    그쵸? 첫번째는 잘못 쓰신거겠죠?
    0
  • CreatorB18
    1k
    2019-05-16 12:01:39 작성 2019-05-16 12:07:46 수정됨

    to. 현진건


    조금만 더 쉽게 설명해주실 수 있나요? 책에는 다음내용은나오지않아서 그렇습니다. 

    이것이 자바다 책을 학습중인데 말씀하신내용은 나와있지않습니다.

    그런데 말씀주셔서 감사합니다.


    와 이제 이해되었습니다. 정말 감사합니다!! ㅎㅎㅎㅎ

    0
  • CreatorB18
    1k
    2019-05-16 12:03:27

    curioustore


    네 수정하였습니다. 잘못쓴것입니다! 

    0
  • curioustore
    1k
    2019-05-16 12:05:52

    Java 언어 사양 15.19. Shift Operators(다소 바꿔 말하면 )에 따라 :

    왼쪽 피연산자의 촉진 유형 인 경우 int오른쪽 피연산자의 다섯 개의 최하위 비트를 사용하는 시프트 거리로. 오른쪽 피연산자 비트 논리 AND 조작을 실시하는 경우로는 &마스크 값 0x1f, 또는 0b11111따라서 실제로 사용되는 이동 거리는 항상 범위 0를 31포함 하여 포함됩니다.

    즉, (예를 들어) 336 비트 바이너리 가 사용되기 전에 1000015 비트로 축소 00001됩니다. 그래서 x << 33와 동일합니다 x << 1.

    0
  • CreatorB18
    1k
    2019-05-16 12:09:15

    to. curioustore



    정말 감사합니다!! ㅎㅎ 쉽게말해서 

    int형 자릿수인 32자리를 


    num = num << (숫자) ;   // 숫자 % 32 의 값이 시프트 연산처리된다. 


    로 생각하면 되는 것이군요! 감사합니다 ㅎㅎ 



     

    1
  • 로그인을 하시면 답변을 등록할 수 있습니다.