인프런 커뮤니티 질문&답변

Ambition님의 프로필 이미지
Ambition

작성한 질문수

홍정모의 따라하며 배우는 C++

13.5 클래스 템플릿 특수화

클래스 템플릿 특수화에서 boolalpha로 표현된 리턴값에 대해 질문이 있습니다.

해결된 질문

작성

·

348

1

#pragma once
#include <bitset>
template <class T>
class Storage8
{
private:
    T array_[8];

public:
    void set(const int& index, const T& value)
    {
        array_[index] = value;
    }

    const T& get(int index) const
    {
        return array_[index];
    }
};

template<>
class Storage8<bool>
{
private:
    unsigned char data_;

public:
    Storage8() :data_(0){}

    void set(int index, bool value)
    {   
        unsigned char mask = 1 << index; // left shift
        std::cout <<"index bit : " << std::bitset<8>(mask) << std::endl;
        
        if (value)
            data_ |= mask; // flag on
        else
            data_ &= ~mask; // flag off
        std::cout << "After masking value : " << std::bitset<8>(data_) << std::endl;
    }

    bool get(int index)
    {
        unsigned char mask = 1 << index;
        return(data_ & mask) != 0; // Has data_?
    }
};

main.cpp

#include <iostream>
#include <array>
#include "Storage8.h"

using namespace std;

int main()
{
    // Define a Storage8 for integers
    Storage8<int> intStorage;

    for (int count = 0; count < 8; count++)
        intStorage.set(count, count);

    for (int count = 0; count < 8; count++)
        cout << intStorage.get(count) << endl;

    cout << "Sizeof Storage8<int> " << sizeof(Storage8<int>) << endl;

    // Define a Storage8 for bool
    Storage8<bool> boolStorage;
    for (int count = 0; count < 8; count++)
        boolStorage.set(count, count & 3); // 늘어나는 count와 3을 bitmasking

    for (int count = 0; count < 8; count++)
        cout << std::boolalpha<< boolStorage.get(count) << endl;

    cout << "Sizeof Storage8<bool> " << sizeof(Storage8<bool>) << endl;
    return 0;
}

이런 결과가 나왔는데요, 원문 learncpp에서는 boolStorage.set(count, count & 3); 처럼 value값에 늘어나는 count와 숫자 3을 넣었습니다. 그런데 이 원리가 어떻게 되는지 잘 모르겠습니다.

답변 1

1

안녕하세요, 답변 도우미 Soobak 입니다.

원문 learncpp 에서 boolStorage.set(count, count & 3); 부분의
value값에 늘어나는 count와 숫자 3을 넣은 부분의 원리에 대해서 질문을 주셨는데요.

3.8 비트단위 연산자 Bitwise Operators,
3.9 비트플래그, 비트 마스크 사용법 BIt flags, Bit masks 강의에서도 학습하셨듯이,

  • & 연산자는 두 개의 이진수를 AND 연산하였을 때, 각 비트의 값이 모두 1 일 때만 결과 값이 1 이 됩니다.

    • 예를 들면 10101010 & 11110000 의 결과는 10100000 이 됩니다.

  • 따라서, & 연산자는 비트 단위에서 두 개의 값 중, 필요한 비트들을 추출하거나, 특정 비트를 1 또는 0 으로 설정하는 데에 유용하게 사용됩니다.

질문해주신 내용을 바탕으로 예를 들어보면,
count & 3 의 경우 count 변수의 마지막 2개의 비트만을 유지 하고, 나머지 비트를 모두 0으로 만듭니다.

  • count0 일 때, count & 30 이 됩니다. 이 때, boolStorage.set(0, 0) 이 호출되면, 0번째 비트가 0 으로 설정됩니다.

  • count3 일 때, count & 33 이 됩니다. 이 때, boolStorage.set(3, 3) 이 호출되면, 3번째 비트가 1 로 설정됩니다.


교수님께서 3.9 비트플래그, 비트마스크 사용법 Bit flags, Bitmasks 강의에서 보다 더 자세하게 설명을 해주시니 다시 한번 복습해보시면 더 자세한 학습이 가능하실 것 같습니다.

질문해주셔서 감사하고, 추가적으로 궁금하신 부분이 있으시면 편하게 댓글 달아주시면 감사하겠습니다. 화이팅!

Ambition님의 프로필 이미지
Ambition
질문자

아, 그렇군요! 제가 count & 3을 mask & 3으로 착각했었네요!! 덕분에 count & 3이 이진수로 연산한다는 것을 알았고, 제가 mask가 *2로 늘어나는 것이 아니라, 1씩 늘어나는 것으로 이해했었네요. 감사합니다 :)

Ambition님의 프로필 이미지
Ambition

작성한 질문수

질문하기