각 셀에 C++에서 2 비트가있는 배열을 만들고 싶습니다. 이 일을 할 수있는 방법이 있습니까?C++에서 각 셀에 대해 단지 2 비트의 배열을 만듭니다.
비트 배열을 만드는 방법이 있지만 각 셀에 단 하나의 비트를 할당합니다.
각 셀에 C++에서 2 비트가있는 배열을 만들고 싶습니다. 이 일을 할 수있는 방법이 있습니까?C++에서 각 셀에 대해 단지 2 비트의 배열을 만듭니다.
비트 배열을 만드는 방법이 있지만 각 셀에 단 하나의 비트를 할당합니다.
방법에 대해 2 비트의 변수 및 6 비트 일 함유 구조체 생성 :
struct split
{
uint8_t sixbits : 6;
uint8_t twobits : 2;
}
그 다음에 대한 구조체의 어레이를 만들고 단지 구조체의 두 비트 부분을 사용을?
NB : 테스트하지 않았습니다 ... here에서 정보를 얻으 셨습니다.
2 비트 멤버의 배열을 갖는 주된 이점은 메모리 절약이다. 그렇지 않으면 (int []'/'char []') 사용할 수있다. – Dukeling
이렇게 할 때는 길이가 2 인 4 비트 필드를 사용하고 div/mod 4에 액세스하지 않는 이유는 무엇입니까? –
std::vector<bool>
당신이 찾고있는 전문 분야가 있습니다. 그런 다음 두 개의 연속 배열 요소를 2 개의 bool 중 하나의 요소로 간주하거나 루프의 인덱스를 2 씩 증가시키지 않으면 래퍼 클래스를 작성할 수 있습니다. 2 비트 변수로 클래스를 생성 할 때의 문제점은 C++에서 가장 작은 변수 크기가 1 바이트이므로 8 비트 (1 바이트)를 차지한다는 것입니다.
완전한 맞춤 솔루션은 문자 배열 (8 비트)을 만든 다음 shift operator을 사용하여 각 문자의 모든 비트를 사용하는 것입니다. 그러나 이것은 값에 액세스 할 때마다 변경하지 않아도되므로 불필요하게 복잡 할 수 있습니다 (... 정확히 정확하게 std::vector<bool>
전문화가 작동하는 방식입니다).
RAM이 "바이트 정렬"되지 않았습니다. 프로세서에 따라 다릅니다. –
사실 고침 주신 데 대해 감사드립니다. –
@Dukeling이 맞다고 가정하면, 헤더가'sizeof()'에 의해 반환 된 크기에 포함되지 않아야합니까? 'sizeof' 빈 클래스는 1 바이트이고, bool 클래스 역시 1 바이트입니다. 나는 당신이 자바에 대해 진실이라고 말하는 것을 알고 있지만 실제로 C++에 대해서도 똑같은가요? –
처음부터이를 작성하려면 다음
아마 구현이 사용하는 모든 비트 세트가 int[]
(또는 정말 다른 정수 계열 형식)가하고, 비트 단위를 사용하는 것입니다 기본 개념 특정 비트를 가져 오거나 설정하는 작업
난 당신이 온라인으로 오픈 소스 구현을 많이 찾을 수 있습니다 확신 한 예는 자바의 BitSet (here 가능). C++의 어딘가에있는 bitset
도있을 것입니다.
같은 생각을 적용 할 수 있습니다. 인덱스를 한 비트로 매핑하는 대신 두 비트로 매핑 할 것입니다.
당신이 표준 라이브러리 클래스를 사용할 수있는 경우 여기에
내가 빨리 함께 넣어 뭔가.
std::bitset
을 확장하는 twoBitSet
클래스를 작성했습니다.이 클래스는 본질적으로 비트 배열입니다. 제공된 색인을 bitset
의 2 비트에 매핑합니다.
보조자 클래스 twoBit
도 있습니다. 다소 어려움없이 []
연산자를 사용하여 데이터를 수정합니다.
#include <iostream>
#include <bitset>
template <size_t N>
class twoBit
{
typedef typename std::bitset<2*N>::reference bitRef;
bitRef a, b;
public:
twoBit(bitRef a1, bitRef b1): a(a1), b(b1) {};
const twoBit &operator=(int i) { a = i%2; b = i/2; return *this; };
operator int() { return 2*b + a; };
};
template <size_t N>
class twoBitSet : private std::bitset<2*N>
{
typedef typename std::bitset<2*N>::reference bitRef;
public:
twoBit<N> operator[](int index)
{
bitRef b1 = std::bitset<2*N>::operator[](2*index);
bitRef b2 = std::bitset<2*N>::operator[](2*index + 1);
return twoBit<N>(b1, b2);
};
};
int main()
{
twoBitSet<32> bs;
bs[0] = 2;
bs[1] = 3;
bs[2] = 1;
bs[3] = 0;
std::cout << bs[0] << std::endl; // prints 2
std::cout << bs[1] << std::endl; // prints 3
std::cout << bs[2] << std::endl; // prints 1
std::cout << bs[3] << std::endl; // prints 0
}
, 그것은 단지 []
연산자를 사용하고 범위 검사를하지 않습니다 수 있습니다. 아마도 (bitset
유사) 2 개 []
연산자 함수를 작성
twoBit
객체를 반환.
답변을 주셔서 감사합니다 @Dukeling, 나는 그것을 테스트해야합니다 ... – Chavoosh
셀 당 2 비트를 어떻게 사용합니까? 컨텍스트를 추가 할 수 있습니까? 아마 우리는 더 나은 솔루션을 제공 할 수 있습니다. – Kevin
표준 라이브러리를 사용하지 않고 즉시 사용할 수는 있지만, 이것을 수행하는 클래스를 만드는 것은 쉽습니다. – Dukeling
@Dukeling 어떻게 할 수 있습니까? 그러한 클래스를 작성하는 방법이 있습니까? – Chavoosh