'C로 보는 프로그래밍 입문/데이터 표현 방식'에 해당되는 글 2건

  1. 2009.04.26 비트단위 연산자
  2. 2009.04.26 진법의 이해

* 비트단위 연산
  - &연산자 : 비트단위 AND
   0 & 0 : return 0
   0 & 1 : return 0
   1 & 0 : return 0
   1 & 1 : return 1

  ex)
   int a = 15  // 00000000  00000000  00000000  00001111
   int b = 20  // 00000000  00000000  00000000  00010100
   int c = a & b
   출력 결과 c = 4로 표현

           00000000  00000000  00000000  00001111
    AND 00000000  00000000  00000000  00010100
  ----------------------------------------------
           00000000  00000000  00000000  00000100 : 4


  - |연산자(OR) : 둘중에 하나라도 1(true)인경우에 반환
   0 | 0 : return 0
   0 | 1 : return 1
   1 | 0 : return 1
   1 | 1 : return 1

  ex) 
     int a = 15  // 00000000  00000000  00000000  00001111
     int b = 20  // 00000000  00000000  00000000  00010100
   int c = a | b
   출력 결과 c = 31로 표현

         00000000  00000000  00000000  00001111
    OR 00000000  00000000  00000000  00010100
  ----------------------------------------------
         00000000  00000000  00000000  00011111 : 31

 

  - ^연산자(XOR):두개가 서로 다른 경우에만 반환
   0 ^ 0 : return 0
   0 ^ 1 : return 1
   1 ^ 0 : return 1
   1 ^ 1 : return 0

  ex) 
     int a = 15  // 00000000  00000000  00000000  00001111
     int b = 20  // 00000000  00000000  00000000  00010100
   int c = a ^ b
   출력 결과 c = 27로 표현

         00000000  00000000  00000000  00001111
    OR 00000000  00000000  00000000  00010100
  ----------------------------------------------
         00000000  00000000  00000000  00011011 : 27


  
   
  - ~연산자(NOT): 값을 반대로 바꾸어 준다
   ~0 : return 1
   ~1 : return 0
   

  ex) 
     int a = 15  // 00000000  00000000  00000000  00001111
     int b = ~a  
   출력 결과 b = 27로 표현

         00000000  00000000  00000000  00001111
    -> 11111111  11111111  11111111  11110000 : (1의 보수, 부호비트도 반전)
   ->  10000000  00000000  00000000  00001111 : (1을 더함)
   ->  10000000  00000000  00000000  00010000 : (값은 -16 )

 


  - <<연산자: 왼쪽 shift연산
   a << b : a의 비트들을 b칸씩 왼쪽으로 이동한 값을 반환
   8 << 2 : 8의 비트들을 왼쪽으로 2칸씩 이동한 값을 반환
   

  ex)
     int a = 15  // 00000000  00000000  00000000  00001111
     int b = a<<2 //a의 비트들을 왼쪽으로 2칸씩 이동
   출력 결과 b = 60로 표현

        00000000  00000000  00000000  00001111
    -> 00000000  00000000  00000000  00111100 : ( 결과 : 60 )  

 

  - >>연산자: 오른쪽 shift연산
   a >> b : a의 비트들을 b칸씩 오른쪽으로 이동한 값을 반환
   8 >> 2 : 8의 비트들을 오른쪽으로 2칸씩 이동한 값을 반환
   

  ex) 
     int a = -10  // 11111111  11111111  11111111  11110110
     int b = a>>2 //a의 비트들을 오른쪽으로 2칸씩 이동
   출력 결과 b = 60로 표현

        11111111  11111111  11111111  11110110
    -> 0011111111  11111111  11111111  111101 : (0으로 채우는 시스템)
    -> 1111111111  11111111  11111111  111101 : (1로채우는 시스템)
  =====================================================
  참고) shift연산자는 시스템(처리방식)에 따라 결과 값이 달라진다

Posted by 버터백통


* 진법의 이해
  - n진수의 표현방식 : n개의 문자를 이용해서 데이터를 표현
    | 0 1 | 2 3 4 5 6 7 8 9 | a b c d e f |
    |2진수|                   |                 |
    |         10진수          |                 |
    |                16진수                      |

 * 2진수와 10진수
  - 10진수 : 0~9를 이용한 데이터표현
  - 2진수 : 0,1을 이용한 데이터 표현
  - 컴퓨터는 내부적으로 모든 데이터를 2진수로 처리
  - 숫자나 문자형은 같은 데이터의 2진수값을 갖지만 Int와 String에 의해 캐릭터셋을 사용
    |...  0     /1바이트   0     0    0   0   0  0  0  0  |
      256      /            128   64  32  16  8  4  2  1   ->값의 표현(2의 배수로 증가)
    위에서 보듯이 1바이트는 128개의 값을 표현

   예) 00000000 : 0
    00001001 : 8 + 1 = 9
    10010010 : 128 + 16 + 2 = 146
    11111111 : 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
    따라서 표현의 범위는 00000000 ~ 11111111으로 0부터 255인 256개를 표현
 
 * 16진수와 10진수
  - 0~9 , a , b , c , d , e , f를 이용한 데이터의 표현
  예) e   : 14
   f   : 15
   10  : 16
   11  : 17
   12  : 18
   13  : 19
   64  : 100
   f(15)이후의 값은 10진수의 10부터 증가처럼 10에서 1씩 값이 증가한다.

 * 비트와 바이트
  비트는 1자리수로 2진수 0, 1을 담는 표현의 최소단위
  바이트는 8비트를 1바이트로 설정
  바이트는 0~255의 256개의 값을 표현

 * 프로그램상에서 8진수와 16진수 표현
  - 8진수는 0으로 시작
  - 16진수는 0x로 시작
  예) a = 10 : 10진수의 10
   b = 0xa : 16진수의 10
   c = 012 : 8진수의 10

 * 정수의 표현방식
  - MSB(most significant bit:가장 중요한 비트) : 가장 왼쪽비트로서 부호를 표현(0은 양수 1은 음수)
  - MSB를 제외한 나머지 비트 : 데이터의 크기를 표현
       |   0   |    0  0  0  0  1  0  1   |
      msb(양수)  data 크기(5) : 00000101 : 5
  
    음수는 양수에 1의 보수를 취하고 1을 더한다.
       | 1 | 1 1 1 1 0 1 0 | -> 5의 1의 보수
       | 1 | 1 1 1 1 0 1 1 | -> 보수에 1을 더함
     msb(음수)  data 크기(5) : 11111011 : -5

  예) 00110011 : 51
   11110000  -> 1의 보수 : 00001111 -> 00010000 : 최초 msb는 1이므로 -(16)
   1의 보수에 1을 더한다.
      00001111
    + 11111111
    -----------
      00010000  1+1은 10, 1이 올라가서 1+1+1이므로 0, 해당 자리에서 1이 또 올라감

 * 실수의 표현 방식
  - 오차가 존재하는 단점이 있지만 데이터의 크기면에서는 효율적이다.(모든 컴퓨터)
    
           [ msb(1.m)*2^(e-127) ]
    | 1 | 0 0 0 0 0 0 1 | 0  0 0 0 0 1 0 1 |
         |       m         |         e            |

   위의 경우 식은 -(1.1)*2^(5-127) -> -(1.1)*2^(122) = -5.84860318145363e+36

Posted by 버터백통