현재 비트 세트가 필요한 프로젝트에서 작업 중입니다. 비트 배열에 uint64_t
배열을 사용하고 있습니다. 내가 부문을 다시 작성하고 일부 영리 및 및 와 모듈로 할 수C - BitArray - uint64_t의 단일 비트 설정
uint64_t index = 42;
bArr[index/64] |= (((uint64_t)1)<<(index%64));
:
내 현재의 문제는 내가 설정하거나 비트를 검사 할 때마다 나는이 같은 작업을 할 필요가있다 비트 시프트 작업뿐만 아니라, 나는 1
의 캐스트에 대해 우려하고 있습니다. 그렇지 않으면 1
이 32 비트 단위로 간주되므로이 캐스트가 필요합니다. 이 예에서 볼 수 있듯이 - 당신은 캐스트없이 잘못된 출력을 얻을 :
uint64_t bArr[4]; // 256 bits
bArr[0] = bArr[1] = bArr[2] = bArr[3] = 0; // Set to 0
uint64_t i = 255;
bArr[i/64] = (bArr[i/64] | (((uint64_t)1)<<(i%64)));
uint32_t i2;
for (i2 = 0; i2 < 256; i2++) {
if ((bArr[i2/64] & (((uint64_t)1)<<(i2%64))) != 0) {
printf("bArray[%" PRIu32 "] = 1\n", i2);
}
}
나는 영리한 방법이 캐스트 주위를받을 수 있습니까? 나는 성능이 아마도 에서 캐스팅으로 인해 어려움을 겪고 있다고 생각했다. 읽기/쓰기 ...
나누기를 다시 작성하지 않고 모듈을 "영리하게"만들지 않습니다. 컴파일러는 이미 그 최적화를 수행 할만큼 충분히 똑똑합니다. 또한 매직 번호를 피하려면'64' 대신'CHAR_BIT * sizeof bArr [0]'을 사용하는 것을 고려하십시오. – unwind
@unwind 팁 주셔서 감사. 내 코드로 테스트 해 볼게. 그래도이 경우입니다. – Matthias
속도를 찾고 있다면, 64 개의 서로 다른 ULL 상수 (모든 가능한 위치로 1 개 사전 시프트 됨)가있는'const uint64_t' 테이블을 제공하고 이에 인덱스를 지정하십시오. – tofro