有没有更好的方法来屏蔽位?

Is there a better way to mask bits?

所以我试图通过屏蔽十六进制数将内存地址拆分为其页码和偏移量组件。但是为了涵盖各种不同位和页面大小的地址,我似乎不得不编写很多嵌套的 if else 语句。现在,我只有 32 位地址大小和 4kib 或 64 kib 验证。当然,有一种更好、更少重复的方法可以做到这一点。我是 C 语言的新手,非常感谢任何帮助,谢谢。

代码:

int main(void)
{
    //MemoryAddress
    unsigned int address = 0xFE03AC12;

    //Address Space
    unsigned int addressSize = calculateAddress(address);

    //Calculating Page Size
    unsigned int pageSize = 4096;
    unsigned int bits = calculatePage(pageSize);

    //Offset Mask
    unsigned int offsetMask;

    //Offset Masking Validation
    bool isValid = true;

    if (charCount == 8)
    {
        if (bits == 12 && addressSize == 32)
        {
            offsetMask = 0x00000FFF;
        }
        else if (bits == 16 && addressSize == 32)
        {
            offsetMask = 0x0000FFFF;
        }
        else
        {
            isValid = false;
            printf("Invalid!");
        }
    }
    else if (charCount == 4)
    {
        //Same code here
    }

    //Masking
    unsigned int offset = address & offsetMask;
    unsigned int vpn = address >> bits ;

    if (isValid == true)
    {
        printf("%X \t%X", vpn, offset);
    }

    return 0;
}

对于您的具体示例,您可以使用:

if ((bits != 12 && bits != 16) || addressSize != 32) {
    isValid = false;
    printf("Invalid!");
} else {
    offsetMask = (1u << bits) - 1;
}

然而,这取决于您所说的“更好”是什么意思。 有许多不同的方面,如内存占用、性能、可读性。

我认为问题中的代码比我提出的代码更具可读性,但效率可能较低。