有没有更好的掩盖位的方法?

问题描述

因此,我试图通过屏蔽十六进制数字将内存地址分为页号和偏移量部分。但是,要覆盖各种不同的位和页面大小的地址,我似乎不得不写很多嵌套的if语句。现在,我只有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;
}

解决方法

对于您的特定示例,您可以使用:

$

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...