2016-08-23 2 views
0

저는 비트 맵 물리적 메모리 관리자를 쓰고 있는데, 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를 반환하십시오) 어떻게 그럴 수 있습니까?

+0

총 비트 수를 정수형으로 원한다면 일부 아키텍처에서는 기계 명령어로 사용할 수 있고 컴파일러 내장으로 사용할 수있는 'popcount'가 필요합니다. * 인접한 * 설정 비트를 계산하려면,'ffs()'또는'clz/ctz' 또는'lzcnt/tzcnt' 또는'bsf/bsr' 또는 이와 동등한 builtins를 찾을 수 있습니다. – EOF

+0

'n' * 연속 * 비트가 비어 있는지 확인하려면 처음과 마지막 몇 비트를 제외하고 한 번에 32 개를 검사 할 수 있습니다. –

답변

5

uint32_t 단어의 범위를 확인 했으므로 루프가 종료됩니다. 당신의 임무는 1 비트 루핑 대신 32 비트 루프를 만드는 것입니다. 위해

Bit groups

당신이 1로 설정 k 낮은 비트 마스크를 구성 할 필요가해야 할, 그리고에 위 (32-k) 세트 :

당신은 양쪽 끝 부분 32 비트 워드를 확인해야 0. 당신은 이런 식으로 작업을 수행 할 수 있습니다

uint32_t mask_K = ~(~0U << k); 

사용

if (block & mask_K) 

을 낮은 k 비트를 테스트하기 위해;

if (block & ~mask_K) 

은 상위 k 비트를 테스트합니다.

+0

'mask_K'의 계산은'k' = 31에 대해 UB를 호출하는 것처럼 보일 것입니다. – njuffa

+0

보통'k' 연속 1 비트 (0)를 가진 32 비트 마스크를 만들기 위해'~ (~ 0U << k) <= k <32), 어쩌면 그것은 당신의 목적에 맞을까요? – njuffa

+0

@njuffa 그게 더 낫네, 고마워! – dasblinkenlight

관련 문제