J'écris un gestionnaire de mémoire physique bitmap et je veux implémenter une fonction qui vérifie si n bits sont libres à partir d'un bit spécifique. En ce moment j'utiliser cette fonction qui vérifie si un seul bit est gratuit et je l'appelle n fois pour voir si n bits sont libres, mais je pense qu'il est pas très efficace de le faire de cette façon:Comment vérifier si un ensemble de bits est 0 à partir d'une position déterminée?
inline static bool physical_memory_map_test(uint32_t bit)
{
return physical_memory.blocks[bit/32] & (1 << bit % 32);
}
Alors Je veux implemnt quelque chose comme ceci: (le « » contient un code pseudo):
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);
}
ou quelque chose de mieux pour vérifier si tous les bits sont 0 (return true) ou si au moins l'un d'eux est un 1 (return false) Comment pourrais-je faire ça?
Si vous voulez le nombre total de bits définis dans un type entier, vous voulez un 'popcount', qui est disponible en tant qu'instruction machine dans certaines architectures, et en tant que compilateur intégré. Si vous voulez compter les bits set * adjacents *, vous pouvez trouver 'ffs()' ou 'clz/ctz' ou' lzcnt/tzcnt' ou 'bsf/bsr' ou les builtins équivalents intéressants. – EOF
Si vous voulez vérifier que les bits 'n' * consécutifs * sont libres, vous pouvez en examiner 32 à la fois, sauf pour le premier et le dernier. –