저는 비트 맵 물리적 메모리 관리자를 쓰고 있는데, n 비트가 특정 비트부터 시작하는지 검사하는 함수를 구현하고 싶습니다. 는 지금은 하나의 비트에 여유 공간이 있는지 확인이 기능을 사용하고 난 n 비트는 무료입니다 있는지 확인하기 위해 그것을 n 번 전화를하지만 난 그것을 이런 식으로 할 매우 효율적이지 생각 : 그래서결정된 위치에서 비트 세트가 0인지 확인하는 방법은 무엇입니까?
inline static bool physical_memory_map_test(uint32_t bit)
{
return physical_memory.blocks[bit/32] & (1 << bit % 32);
}
을 (""마크가 의사 코드를 포함) : :이 같은 것을 implemnt하려면 적어도 그들 중 하나가 1이면 더 나은
static bool physical_memory_map_test(uint32_t starting_bit, uint32_t count)
{
int excess = (starting_bit%32 + count) -32;
if(excess < 0)
return (physical_memory.blocks[bit/32] & "-excess number of 1s" << bit % 32)) && (physical_memory.blocks[bit/32] & "count + excess number of 1s" << bit % 32));
return physical_memory.blocks[bit/32] & ("count number of ones, if count is 3, this should be 111" << bit % 32);
}
또는 뭔가 (모든 비트가 0 (true를 반환)을하는 경우를 확인하거나 false를 반환하십시오) 어떻게 그럴 수 있습니까?
총 비트 수를 정수형으로 원한다면 일부 아키텍처에서는 기계 명령어로 사용할 수 있고 컴파일러 내장으로 사용할 수있는 'popcount'가 필요합니다. * 인접한 * 설정 비트를 계산하려면,'ffs()'또는'clz/ctz' 또는'lzcnt/tzcnt' 또는'bsf/bsr' 또는 이와 동등한 builtins를 찾을 수 있습니다. – EOF
'n' * 연속 * 비트가 비어 있는지 확인하려면 처음과 마지막 몇 비트를 제외하고 한 번에 32 개를 검사 할 수 있습니다. –