问题描述
因此,我试图通过屏蔽十六进制数字将内存地址分为页号和偏移量部分。但是,要覆盖各种不同的位和页面大小的地址,我似乎不得不写很多嵌套的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;
}
解决方法
对于您的特定示例,您可以使用:
$
但这取决于您所说的“ 更好”是什么意思。 有很多不同方面,例如内存占用量,性能,可读性。
我认为问题中的代码比我提出的代码更具可读性,但效率可能较低。