如何从确定的位置检查一组位是否为0?

Man*_*rez 0 c bit-manipulation bitmapdata

我正在写一个位图物理内存管理器,我希望实现一个函数,检查一个位是否从特定位开始是空闲的.现在我使用这个函数来检查单个位是否空闲,我调用它n次以查看n位是否空闲,但我认为这样做效率不高:

inline static bool physical_memory_map_test(uint32_t bit)
{
    return physical_memory.blocks[bit/32] & (1 << bit % 32);
}
Run Code Online (Sandbox Code Playgroud)

所以我想实现这样的东西:("包含伪代码):

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); 
}
Run Code Online (Sandbox Code Playgroud)

或者更好的方法来检查所有位是否为0(返回true)或者其中至少有一位是1(返回false)我怎么能这样做?

das*_*ght 5

由于您正在检查一系列uint32_t单词,因此最终会得到一个循环.你的任务是使它循环32位而不是循环1位.

您需要检查两端的部分32位字:

位组

为此,您需要构造一个掩码,其k低位设置为1,而upper (32-k)设置为0.你可以这样做:

uint32_t mask_K = ~(~0U << k);
Run Code Online (Sandbox Code Playgroud)

使用

if (block & mask_K)
Run Code Online (Sandbox Code Playgroud)

测试低位k;

if (block & ~mask_K)
Run Code Online (Sandbox Code Playgroud)

测试k高位.