ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Bit Shift에 대해 알아보자.
    개발하면서/etc 2012. 1. 31. 23:25
    반응형

    Lucene의 OpenBitSet보다가 '>>>'연산자를 알게 되었고, 그러다가 shfit연산에 대해 다시 공부하게 되었습니다.

    2년전에 하긴 했는데......기억이 안 나네....ㅋㅋㅋㅋㅋㅋㅋ
    http://dol9.tistory.com/66 

    http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts  의 내용입니다.

    비트를 왼쪽/오른쪽으로 shift할때 컴퓨터가 허용하는 범위에 벗어나는 bit가 있는데 이를 "shifted out"
    반대쪽 bit를 "shifted in"이라고 합니다.

    Arithmetic shift
       shifted out은 모두 무시.
       left shift할때  shifted in을 0으로 채움, right shift는 부호비트로 채움(MSB) 
    ASR 명령어가 영향을 주는 flag :  http://www.daniweb.com/software-development/assembly/threads/230858 
    ASR 명령어에 대한 간단한 설명 :  http://cafe.daum.net/electronics99/Fgzr/93?docid=LsS5|Fgzr|93|20040924161928&q=asr%20register 

     

    Logical shift
       shifted out은 모두 무시.
       left/right shift 모두 shifted in을 0으로 채움
       Arithmetic shift와 다른점은 Logical은 unsigned, Arithmetic은 signed 에 사용된다는 점입니다.

     

     

    Circular shift
       shifted out이 다시 shifted in으로 채워집니다.
       carry flag를 사용할때 : right shift시, carry flag가 0이라면, logical shift와 동일하고,
       carry flag에sign bit가 복사되었다면 arithmetic shift와 동일합니다.

     

     

    C  -   unsigned integer 일때는 logical shift,  signed integer  '>>' 는 대부분 arithmetic, '<<'는                                   undefined(overflow에 대해서 undefined)


    Java - 모두 arithmetic shift,   >>> 는 logical shift, <<<는 logical shift와 arithmetic shift가 동일해서 없음.
       byte를 '>>>'할때는 java 의 type promotion 때문에 arithmetic shift가 수행이 된다.
       cast를 하던지, bit mask후 '>>>'하면 logical shift를 수행하게 된다.
    java Binary Numeric Promotion

     

    #include <stdio.h>
    
    //http://stackoverflow.com/questions/111928/is-there-a-printf-converter-to-print-in-binary-format
    #define BYTETOBINARYPATTERN "%d%d%d%d%d%d%d%d\n"
    #define BYTETOBINARY(byte)  \
      (byte & 0x80 ? 1 : 0), \
      (byte & 0x40 ? 1 : 0), \
      (byte & 0x20 ? 1 : 0), \
      (byte & 0x10 ? 1 : 0), \
      (byte & 0x08 ? 1 : 0), \
      (byte & 0x04 ? 1 : 0), \
      (byte & 0x02 ? 1 : 0), \
      (byte & 0x01 ? 1 : 0)
    
    int main()
    {
            char value = -24;
            int i;
            printf ("Leading text "BYTETOBINARYPATTERN, BYTETOBINARY(value));
    
            /*for (i = 0; i < 20; i++){
                    value <<= 1;
                    printf ("Leading text "BYTETOBINARYPATTERN, BYTETOBINARY(value));
                    printf("int value : %d\n", (int)value);
            }*/
            value = -24;
            for (i = 0; i < 20; i++){
                    value >>= 1;
                    printf ("Leading text "BYTETOBINARYPATTERN, BYTETOBINARY(value));
                    printf("int value : %d\n", (int)value);
            }
    
            return 0;
    }
    

     

    아하....출력 결과를 보면 무릎을 치고....ㅎㅎ
    Circular shift http://msdn.microsoft.com/en-us/library/t5e2f3sc%28VS.80%29.aspx
    예제 실행결과

     

    아....알차게 학습했다. OpenBitSet은 언제......

    반응형

    댓글

Designed by Tistory.