2013-10-21 1 views
2

각 셀에 C++에서 2 비트가있는 배열을 만들고 싶습니다. 이 일을 할 수있는 방법이 있습니까?C++에서 각 셀에 대해 단지 2 비트의 배열을 만듭니다.

비트 배열을 만드는 방법이 있지만 각 셀에 단 하나의 비트를 할당합니다.

+0

셀 당 2 비트를 어떻게 사용합니까? 컨텍스트를 추가 할 수 있습니까? 아마 우리는 더 나은 솔루션을 제공 할 수 있습니다. – Kevin

+2

표준 라이브러리를 사용하지 않고 즉시 사용할 수는 있지만, 이것을 수행하는 클래스를 만드는 것은 쉽습니다. – Dukeling

+0

@Dukeling 어떻게 할 수 있습니까? 그러한 클래스를 작성하는 방법이 있습니까? – Chavoosh

답변

1

방법에 대해 2 비트의 변수 및 6 비트 일 함유 구조체 생성 :

struct split 
{ 
    uint8_t sixbits : 6; 
    uint8_t twobits : 2; 
} 

그 다음에 대한 구조체의 어레이를 만들고 단지 구조체의 두 비트 부분을 사용을?

NB : 테스트하지 않았습니다 ... here에서 정보를 얻으 셨습니다.

+3

2 비트 멤버의 배열을 갖는 주된 이점은 메모리 절약이다. 그렇지 않으면 (int []'/'char []') 사용할 수있다. – Dukeling

+0

이렇게 할 때는 길이가 2 인 4 비트 필드를 사용하고 div/mod 4에 액세스하지 않는 이유는 무엇입니까? –

0

std::vector<bool> 당신이 찾고있는 전문 분야가 있습니다. 그런 다음 두 개의 연속 배열 요소를 2 개의 bool 중 하나의 요소로 간주하거나 루프의 인덱스를 2 씩 증가시키지 않으면 래퍼 클래스를 작성할 수 있습니다. 2 비트 변수로 클래스를 생성 할 때의 문제점은 C++에서 가장 작은 변수 크기가 1 바이트이므로 8 비트 (1 바이트)를 차지한다는 것입니다.

완전한 맞춤 솔루션은 문자 배열 (8 비트)을 만든 다음 shift operator을 사용하여 각 문자의 모든 비트를 사용하는 것입니다. 그러나 이것은 값에 액세스 할 때마다 변경하지 않아도되므로 불필요하게 복잡 할 수 있습니다 (... 정확히 정확하게 std::vector<bool> 전문화가 작동하는 방식입니다).

+0

RAM이 "바이트 정렬"되지 않았습니다. 프로세서에 따라 다릅니다. –

+0

사실 고침 주신 데 대해 감사드립니다. –

+0

@Dukeling이 맞다고 가정하면, 헤더가'sizeof()'에 의해 반환 된 크기에 포함되지 않아야합니까? 'sizeof' 빈 클래스는 1 바이트이고, bool 클래스 역시 1 바이트입니다. 나는 당신이 자바에 대해 진실이라고 말하는 것을 알고 있지만 실제로 C++에 대해서도 똑같은가요? –

1

처음부터이를 작성하려면 다음

아마 구현이 사용하는 모든 비트 세트가 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 객체를 반환.

Live demo.

+0

답변을 주셔서 감사합니다 @Dukeling, 나는 그것을 테스트해야합니다 ... – Chavoosh