해결된 질문
작성
·
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으로 만듭니다.
count
가 0
일 때, count & 3
은 0
이 됩니다. 이 때, boolStorage.set(0, 0)
이 호출되면, 0
번째 비트가 0
으로 설정됩니다.
count
가 3
일 때, count & 3
은 3
이 됩니다. 이 때, boolStorage.set(3, 3)
이 호출되면, 3
번째 비트가 1
로 설정됩니다.
교수님께서 3.9 비트플래그, 비트마스크 사용법 Bit flags, Bitmasks 강의에서 보다 더 자세하게 설명을 해주시니 다시 한번 복습해보시면 더 자세한 학습이 가능하실 것 같습니다.
질문해주셔서 감사하고, 추가적으로 궁금하신 부분이 있으시면 편하게 댓글 달아주시면 감사하겠습니다. 화이팅!
아, 그렇군요! 제가 count & 3을 mask & 3으로 착각했었네요!! 덕분에 count & 3이 이진수로 연산한다는 것을 알았고, 제가 mask가 *2로 늘어나는 것이 아니라, 1씩 늘어나는 것으로 이해했었네요. 감사합니다 :)