编程求出Cache映射方式下各类地址位数(简洁版)

计算机组成原理老师给小明出了一道Cache映射方式相关的计算题目:
某系统的存储器为4MB,每字块为32个字,每字8位,若Cache为2MB,采用字节编址方式。问:

(1)存储器块内地址共有_____位
(2)Cache行号地址共有_____位
(3)采用全相联映射,块表中的主存标记位共有_____位
(4)采用直接映射,块表中的主存标记位共有_____位
(5)采用16路组相联映射,块表中的主存标记位共有_____位

小明想借助计算机帮忙自己算出答案,今后无论老师出何种组合,他都能一键运行答案,于是他开始了求Cache映射方式下各类地址位数的代码编写。现在他已经写出了y= l o g 2 x log_2 x log2x 的函数,编程时可以直接使用。

int log2(int x)
{
    float fx;
    unsigned long ix, exp;
    fx = (float)x;
    ix = *(unsigned long*)&fx;
    exp = (ix >> 23) & 0xFF;
    return exp - 127;
}

输入格式:
直接输入5个十进制正整数,中间用空格隔开,且保证这5个数的值都等于2的幂次,并符合存储器的一般约束性,如存储器容量会大于Cache容量。
这5个正整数分别代表
(1)存储器容量有多少MB(如题目中数字4);
(2)每字块多少个字(如题目中数字32);
(3)每字多少位(如题目中数字8);
(4)cache容量有多少MB(如题目中数字2);
(5)采用几路组相联(如题目中数字16)

输出格式:
见输出样例(注意输出的符号都是半角)。

输入样例:
在这里给出一组输入。例如:

4 32 8 2 16
4096 512 32 16 32

输出样例:
在这里给出相应的输出。例如:

1.存储器块内地址共有5位
2.Cache行号地址共有16位
3.采用全相联映射|块表中的主存标记位共有17位
4.采用直接映射|块表中的主存标记位共有1位
5.采用16路组相联映射|块表中的主存标记位共有5位
1.存储器块内地址共有11位
2.Cache行号地址共有13位
3.采用全相联映射|块表中的主存标记位共有21位
4.采用直接映射|块表中的主存标记位共有8位
5.采用32路组相联映射|块表中的主存标记位共有13位
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

参考代码一:

#include <stdio.h>

int log2(int x);

int main(void)
{
    int memorySize, blockwordSize, wordSize, cacheSize, wayNum;
    scanf("%d %d %d %d %d", &memorySize, &blockwordSize, &wordSize, &cacheSize, &wayNum);
    
    int blockSize = blockwordSize * wordSize >> 3;
    int memoryNum = log2(memorySize) + 20;
    
    int blockAddress = log2(blockSize);
    printf("1.存储器块内地址共有%d位\n", blockAddress);
    
    int cacheAddress = log2(cacheSize * (1 << 20) / blockSize);
    printf("2.Cache行号地址共有%d位\n", cacheAddress);
    
    int FAMicon = memoryNum - blockAddress;
    printf("3.采用全相联映射|块表中的主存标记位共有%d位\n", FAMicon);
    
    int DMicon = memoryNum - blockAddress - cacheAddress;
    printf("4.采用直接映射|块表中的主存标记位共有%d位\n", DMicon);
    
    int GAMicon = memoryNum - log2((1 << cacheAddress) / wayNum) - blockAddress;
    printf("5.采用%d路组相联映射|块表中的主存标记位共有%d位", wayNum, GAMicon);
}

int log2(int x)
{
    float fx;
    unsigned long ix, exp;
    fx = (float) x;
    ix = *(unsigned long *) & fx;
    exp = (ix >> 23) & 0xFF;
    return exp - 127;
}

参考代码二:

#include<stdio.h>
int log2(int x)
{
    float fx;
    unsigned long ix, exp;
    fx = (float)x;
    ix = *(unsigned long*)&fx;
    exp = (ix >> 23) & 0xFF;
    return exp - 127;
}
int main()
{
    int a,b,c,d,e;
    scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
    int num1=log2(b*c)-3;
    int num2=log2(d)+20-num1;
    int num3=log2(a)+20-num1;
    int num4=log2(a)+20-num1-num2;
    int num5=(log2(d)+3+20)-log2(e*b*c);
    num5=num3-num5;
    printf("1.存储器块内地址共有%d位\n",num1);
    printf("2.Cache行号地址共有%d位\n",num2);
    printf("3.采用全相联映射|块表中的主存标记位共有%d位\n",num3);
    printf("4.采用直接映射|块表中的主存标记位共有%d位\n",num4);
    printf("5.采用%d路组相联映射|块表中的主存标记位共有%d位\n",e,num5);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qing影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值