如何从确定的位置检查一组位是否为 0?
How to check if a set of bits are 0 from a determinated position?
我正在编写一个位图物理内存管理器,我想实现一个函数来检查从特定位开始的 n 位是否空闲。
现在我使用这个函数来检查一个位是否空闲,我调用它 n 次以查看 n 位是否空闲,但我认为这样做效率不高:
inline static bool physical_memory_map_test(uint32_t bit)
{
return physical_memory.blocks[bit/32] & (1 << bit % 32);
}
所以我想实现这样的东西:(“”包含伪代码):
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(return true)或者是否至少其中一个为 1(return false)
我该怎么做?
由于您正在检查 uint32_t
个单词的范围,因此您最终会遇到一个循环。你的任务是让它循环 32 位而不是循环 1 位。
两端需要检查部分32位字:
为此,您需要构造一个掩码,其中 k
低位设置为 1
,高位 (32-k)
设置为 0
。你可以这样做:
uint32_t mask_K = ~(~0U << k);
使用
if (block & mask_K)
测试较低的 k
位;
if (block & ~mask_K)
测试高 k
位。
我正在编写一个位图物理内存管理器,我想实现一个函数来检查从特定位开始的 n 位是否空闲。 现在我使用这个函数来检查一个位是否空闲,我调用它 n 次以查看 n 位是否空闲,但我认为这样做效率不高:
inline static bool physical_memory_map_test(uint32_t bit)
{
return physical_memory.blocks[bit/32] & (1 << bit % 32);
}
所以我想实现这样的东西:(“”包含伪代码):
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(return true)或者是否至少其中一个为 1(return false) 我该怎么做?
由于您正在检查 uint32_t
个单词的范围,因此您最终会遇到一个循环。你的任务是让它循环 32 位而不是循环 1 位。
两端需要检查部分32位字:
为此,您需要构造一个掩码,其中 k
低位设置为 1
,高位 (32-k)
设置为 0
。你可以这样做:
uint32_t mask_K = ~(~0U << k);
使用
if (block & mask_K)
测试较低的 k
位;
if (block & ~mask_K)
测试高 k
位。