2014-09-11 2 views
0

저는 비트의 벡터를 가지고 있습니다. 그리고 그것을 다른 벡터로 복사하고 싶습니다. (간단히 말하자면, 다른 벡터의 시작 부분으로 말입니다.) 각 바이트 내의 비트 정렬이 변경되기 때문에 모든 비트가 첫 번째 요소뿐만 아니라 일부 방향으로 이동 (또는 오히려 회전) 될 필요가 있습니다.비트 벡터에 대한 memcpy()와 유사한 함수?

void *memcpy_bits(
    char* destination, 
    char* source, 
    size_t offset_into_source_in_bits, 
    size_t num_bits_to_copy); 

그리고 그 데이터는 바이트 그래서 엔디안 문제에 저장되지 않으며, 하위 비트는 벡터에 처음 온 :

가정 명확성을 위해, 서명이입니다. 다른 가정을 수용하기 위해 서명을 좀 더 복잡하게 만들 수 있지만 지금은 그렇게 생각하지 마십시오.

그래서,

  • 는 (x86 또는 x86_64의 CPU가 내 말에)이 작업을 수행하는 일부 하드웨어 지원이 있습니까?
  • 이 기능의 일부 표준/관용적/널리 사용되는 구현이 있습니까?
+0

'std :: vector '전문 분야를 보셨습니까? 이터레이터를 지원하는 비트 기반의 벡터이므로, 예를 들어'std :: copy()'를 사용할 수 있어야합니다. –

+0

@RemyLebeau :하지만 모든 C++ 라이브러리 구현에서 기대했던 것처럼이 전문화 기술을 신뢰할 수 있습니까? 그리고 원시 난 비트 벡터를 새로운 std :: vector 으로 작성하면 난해한 할당 자 템플릿 코드를 쓰지 않아도됩니까? – einpoklum

+0

예, 신뢰할 수 있습니다. 그리고 요점은 왜 수동 벡터 구현을 사용하고 대신 벡터 을 사용하지 않겠습니까? –

답변

1

먼저 데이터 저장 방법을 정의해야합니다. uint8_t, uint16_t, uint32_t 또는 uint64_t의 배열에 저장되어 있습니까? 비트 # 0은 값 1u로 저장됩니다 < <? void *를 사용하지 말고 데이터 저장에 사용되는 기본 유형을 사용해야합니다.

둘째, 당신은 분명히 (당신이 무엇을 할 것이다, 그렇지 않은 경우?) offset_into_source_in_bits은 기본 데이터 타입의 비트 수보다 작다는 것을 가정 할 수

셋째, 오프셋 인 경우 0 다음 방금 수 memcpy를 호출하십시오. 오프셋이 0이면 다음 코드가 작동하지 않기 때문에 중요합니다.

넷째, num_bits_to_copy> = 기본 유형의 비트 수만큼 저장할 다음 단위를 계산할 수 있습니다 두 교대를 사용하여 목적지.

다섯째, 기본 유형의 비트 수가 < num_bits_to_copy <이면 실제로 존재하지 않는 소스 비트를 읽지 않도록주의해야합니다.

겹쳐서는 안되는 비트를 덮어 쓰지 않도록 조심하고, 개인적으로 대상 비트에도 오프셋을 적용하여 임의의 비트 범위를 복사 할 수 있습니다. memmove_bits 함수도 구현할 수 있습니다.

+0

좋아, 나는 그 모든 것을 깨닫는다. 그러나 실제로 나의 질문에 대한 대답이 아니다 ... – einpoklum

관련 문제