본문 바로가기
C │ C++ │ C#/C++

C++ Chapter 3.2 : 이진수

by Pokaa 2023. 8. 17.
728x90
728x90
SMALL
  • 주의 사항
    ο C++은 제곱 연산자가 없다.
    ο x^2는 잘못된 것.
        ■ ^는 비트 연산자에서 XOR이다.

 

이진수 -> 십진수 변환


01011110 = 0×2$^7$ + 1×2$^6$ + 0×2$^5$ + 1×2$^4$ + 1×2$^3$ + 1×2$^2$ +1×2$^1$ + 0×2$^0$

= 64 + 16 + 8 + 4 + 2

∴01011110=94

 

 

십진수 -> 이진수 변환


148=10010100

 


첫 번째 방법

  • 몫이 0이 될 때까지 몫을  로 계속 나누는 행위를 반복한다.
  • 매 나눗셈마다 도출 된 나머지를 역순으로 출력하면 이진수 완성 !

 


두 번째 방법

  1. num보다 작거나 같은  2의 제곱들  中 가장 큰 수 찾기
    ο 이를 X라고 하겠다. 2^n = X
        ■ num = 128, X = 128, n = 7
  2. num ≥ X 비교한다.
    ο true면
        1.  출력
        2. num = num - X
            ■ 148 - 128 = 20
        3. n = n - 1
        4. X = 2^n
    ο false면
        1.  출력
        2. n = n - 1
        3. X = 2^n
  3. X = 0 이 될 때까지 2. 을 반복한다.
    ο 총 초기 n + 1번 반복 - input = 148 이라면 최종적으로  10010100  이 출력 될 것.
#include <iostream>

using namespace std;

int main()
{
    const int input = 148;  // input 값은 상수로 설정했다. 보존하기 위해.
    int num = input;  // num 초기값은 input값.
    int x = 1, n = 0; // x, n 초기값

    /* num보다 작거나 같은 2의 제곱들 中 가장 큰 수 찾기 ------------------------*/
    while(true)
    {
        n++;
        x = x * 2;
        if (num < x)
        {
            n--;
            x = x / 2;
            break;
        }
    }
/* 최종적으로 x = 128, n = 7이 될 것 ---------------------------------------*/


    for(int i = 1; i <= n + 1;  i++)  // n + 1 번 반복
    {
        if (num >= x)
        {
            cout << 1 ; // 1 출력 
            num = num - x; // 이에 경우 num값 업데이트 
            x = x / 2;
        }
        else
        {
            cout << 0;  // 0 출력
            x = x / 2;
        }
    }

    cout << endl;

    return 0;
}

 

 

이진수끼리의 덧셈

 

 

음의 십진수 -> 음의 이진수 변환

 

  1. 절대값 취하기
    ο  -5  의 절대값 
  2. 이진수로 변환하기
    ο  5 의 이진수 =  00000101 
  3. 보수 취하기
    ο  11111010 
  4. 1을 더해주기
    ο 11111011 이게 바로 -5 의 이진수
        ■ 1 을 더해주는 이유는 0이 +0, -0 두가지로 표현되는 것을 막기 위해서
    ο +0 → 00000000
        ■ 1 더해서 다 밀어주고
    ο -0 → 11111111
        ■ 1 더해서 -0을 하나밖에 없는 진짜 0으로 만든다. 0을 1개만 존재하게 하기 위하여.

 

음의 이진수 -> 음의 십진수 변환

 

  1. 1을 빼주기
    ο  11111011  00000001  11111010 
  2. 보수 취하기
    ο  11111010  의 보수 →  00000101 
    ο 1~2번까지는 양의 이진수로 변환하는 과정
  3. 십진수로 변환하기
    ο  00000101  = 14 + 11 = 
  4. sign 비트 고려하여 - 붙여주기
    ο  -5 

 

 

signed Vs. unsigned


10011110

 

  • signed →  -98 
    ο signed 비트이므로 맨 앞 비트 1개는 부호를 뜻한다.
    ο 1이므로 음수.
    ο 음의 이진수 → 음의 십진수 방식대로 변환해주어야 한다.
  • unsigned →  158 
    ο signed 비트이므로 sign비트는 존재하지 않는다.
    ο 그냥  10011110  = 128 + 32 + 16 + 8 + 4 + 2 = 158
  • 이렇게 같은 이진수라도 signed냐 unsigned냐에 따라 값이 다르다.
728x90
300x250
LIST