[C++ 언어-기초실습-17] 정수를 비트단위로 출력하기?

in #kr-dev5 years ago (edited)

[C++ 언어-기초실습-17] 정수를 비트단위로 출력하기?



입력 받은 정수를 비트 단위로 출력하는 실습을 하도록 하겠습니다. 비트 단위 수를 알기 위해서는 8421코드표를 알아야 하는데 이 부분은 인터넷에서 찾아보시기 바랍니다. 8421코드는 젤 오른쪽 1번째 자리 1 단위로 1과 0이 반복되고 두번째 2는 1과 0이 반복되는데 일의 자리 1과 0의 반복 횟수를 더한 값 총 2단위로 바뀌게 됩니다. 세번째 4은 4단위로 바뀌고 네번째 8은 8단위로 1과 0이 바뀌게 됩니다. 말이 좀 이상하게 설명 된것 같은데 표를 보시고 1과 0의 변화를 보시면 아마 8421코드표를 이해 하실 수 있을 거에요.

우리가 어떤 값을 저장 할 때 저장 공간이 있는데 bit->byte->kb->mb 등 단위로 이루어져 있습니다. 1byte은 8bit로 구성되어 있습니다. 예로 1이라는 10진수가 2진수 "00000001"이라는 값으로 구성 되어 있습니다. 인간이 볼때는 1이라는 숫자로 보지만 컴퓨터가 이해하는 언어는 "00000001"이라는 신호로 이해합니다. 0과 1은 컴퓨터가 0은 전류가 흐르지 않는 상태이고 1은 전류가 흐르는 상태입니다. 빠르게 0과 1의 전기 신호가 흐르고 컴퓨터는 이 신호에 의해서 1이라는 숫자를 이해하게 됩니다.

아무튼 각 자리는 bit라고 부르고 이 비트 출력을 한번 실습해보도록 하죠.

1. bit 출력


#include <bitset>
cout<<bitset<16>(a)<<endl;

C++ 에서는 위와 같이 bitset<출력비트수>로 해서 a라는 값을 출력하게 됩니다.

[예제]

#include <iostream>
#include <bitset>

using namespace std;

int main(int argc, char** argv) {
    
    int  a=10;
    
    cout<<bitset<16>(a)<<endl;
    cout<<a<<endl;
    return 0;
}

[결과]
a1.jpg

2. 비트 출력 직접 만들기


간단히 위와 같이 제공되는 함수를 사용해도 되지만 코딩을 배우는 입장이라면 직접 구현해보는 것도 나쁘지 않겠죠.

직접 구현해 볼까요. 1byte은 8bit로 구성되어 있고 오른쪽 비트 부터 2의 승으로 나열 됩니다.

2의0승 => 1
2의 1승 => 2
2의 2승 => 4
...
2의7승 => 128

128, 64, 32, 16, 8, 4, 2, 1 이렇게 배치가 되고 각 비트 비교 체크를 통해 일치하는지를 통해 0과 1을 표현하게 됩니다.

8bit 체크문을 만든다고 가정하면 while문으로 구현하면 다음과 같습니다.

int flag = 128;     
do{
    output=a&flag;
    if(a&flag) cout<<1;
    else cout<<0;
    flag/=2;        
}
while(flag>=1);

&연산자를 이용하여 각 자리의 비트를 비교하게 됩니다. 그래서 총 8번 비교하게 되고 각 자리의 비트 수가 1인지 0인지를 판정하게 됩니다.

[전체소스]

#include <iostream>

using namespace std;

int main(int argc, char** argv) {
    
    int a;  
    int output;
    int flag = 128;     
    
    cout<<"정수 하나를 입력하시오? ";
    cin>>a;
    
    cout<<a<<" => ";
    do{
        output=a&flag;
        if(a&flag) cout<<1;
        else cout<<0;
        flag/=2;        
    }
    while(flag>=1);
    cout<<endl;
    
    return 0;
}

[결과]
a2.jpg

마무리


오늘은 비트 출력을 해보았네요. 예전에 비트 관련 post를 쓴 것 같은데 가물거리고 그냥 C++ 주제에 맞게 실습 post를 작성합니다.


Sponsored ( Powered by dclick )

dclick-imagead

Sort:  

C++ 대학교 1학년때 기초 과목으로 배웠던 기억이 나네요. 기억 나는건 Hello, world! 정도일까요.. 이렇게 다시 접하게 되니까 좋네요!

프로그램언어는 "hello World!"를 출력 할 수 있으면 프로그램 절반 할 줄 아는 것이죠.
^^

Thank you for your continued support towards JJM. For each 1000 JJM you are holding, you can get an additional 1% of upvote. 10,000JJM would give you a 11% daily voting from the 700K SP virus707 account.