找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1150|回复: 13
打印 上一主题 下一主题
收起左侧

关于C语言代码精简 原理知道,但是不知道怎么算?

[复制链接]
跳转到指定楼层
楼主
ID:510170 发表于 2022-3-20 16:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有大神能精简下下面的代码吗?谢谢了。原理知道。但是不知道怎么算。
number除以32,得出的商乘以0x0200,再加上0x1800就可以得到a_addr了
number除以32,得到的余数再乘以16,就可以得到a_addr了。但是
打印出来的数据不对。看看有大神帮忙看看错在那里,应该怎么写才行。
我自己写的,但是不对
number=51;                                                               
a_addr = (number / 32)*0x0200+0x1800 ;
b_addr = (number % 32)*16 ;
printf("开始地址=%bd  \n", a_addr);
printf("\r\n");
printf("内存开始地址=%bd  \n", b_addr);
printf("\r\n");
下面是需要精简的代码

                if (0 = < number < 32) //如果是第1扇区
                {
                    a_addr = 0x1800;
                    b_addr = number * 16;
                }
                else if (32 = < number < 64) //如果是第2扇区
                {
                    a_addr = 0x1A00;
                    b_addr = (number * 16) - 0x0200;
                }
                else if (64 = < number < 96) //如果是第3扇区
                {
                    a_addr = 0x1C00;
                    b_addr = (number * 16) - 0x0400;
                }
                else if (96 = < number < 128) //如果是第4扇区
                {
                    a_addr = 0x1E00;
                    b_addr = (number * 16) - 0x0600;
                }
                else if (128 = < number < 160) //如果是第5扇区
                {
                    a_addr = 0x2000;
                    b_addr = (number * 16) - 0x0800;
                }






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2022-3-20 17:35 | 只看该作者
你需要的是写出正确的代码,精简那还是很久很久以后的要求了。

给你个提示:if (0 = < number < 32),括号里面的写法错的一塌糊涂。
回复

使用道具 举报

板凳
ID:401564 发表于 2022-3-20 18:59 | 只看该作者
精减代码的意义何在?让英文字母减少吗?
我在这论坛第一次看到这样的代码:if (0 = < number < 32),可能是我学的不太好吧,我不会用这种代码的
有时候代码多并不一定是坏事,就拿8051的中断来说,IE=0x84远远没有 EX1=1;EA=1;的直观
回复

使用道具 举报

地板
ID:510170 发表于 2022-3-20 20:06 | 只看该作者
Y_G_G 发表于 2022-3-20 18:59
精减代码的意义何在?让英文字母减少吗?
我在这论坛第一次看到这样的代码:if (0 = < number < 32),可能是我 ...

这个没有人教呀。都是自己摸索的。能跑就行了。我也就是个爱好者。
回复

使用道具 举报

5#
ID:510170 发表于 2022-3-20 20:22 | 只看该作者
Hephaestus 发表于 2022-3-20 17:35
你需要的是写出正确的代码,精简那还是很久很久以后的要求了。

给你个提示:if (0 = < number < 32),括 ...

那应该怎么写呢?麻烦指点下,谢谢了。
回复

使用道具 举报

6#
ID:161164 发表于 2022-3-20 22:28 | 只看该作者
你知到吗?
0x02 = 512可以被32整除的
512 / 32 = 16
所以a_addr = (number / 32)*0x0200+0x1800 ;
可以写成:a_addr = number * 16 +0x1800 ;

而 if (0 = < number < 32)的正确写法是
if((0 <= number) && (number < 32))当中的"&&"是条件与运算
回复

使用道具 举报

7#
ID:510170 发表于 2022-3-21 07:29 | 只看该作者
lkc8210 发表于 2022-3-20 22:28
你知到吗?
0x02 = 512可以被32整除的
512 / 32 = 16

谢谢你,受教了。
回复

使用道具 举报

8#
ID:844772 发表于 2022-3-21 08:51 | 只看该作者
f((0 <= number) || (number>160))
   //出错处理;
  else
   {   a_addr = 0x1800+(int)(number/32)*0x200;
        b_addr = number * 16-( a_addr-0x1800;);
   }
      
回复

使用道具 举报

9#
ID:827243 发表于 2022-3-21 09:38 | 只看该作者
二进制温习一下吧
a_addr=(number>>5)*0x200+0x1800;
b_addr=(number & 32) * 16;

6楼的做法仔细考虑一下,应该是有问题的。
a_addr应该是页地址,所以 number =1 时 a_addr 是 0x1800 而不是 0x1800+ 1* 16=0x1810

回复

使用道具 举报

10#
ID:1006306 发表于 2022-3-21 11:29 | 只看该作者
a=number/32;
回复

使用道具 举报

11#
ID:1006306 发表于 2022-3-21 11:40 | 只看该作者
a=number/32;          //计算倍数关系   0 = < number < 32------------a=0   32 = < number < 64)----------a=1 a_addr = (0x1800)+ (a*0x0200)//是不是 0x0200的倍数,你自己算下哈 b_addr = (number * 16) - (a*0x0200);// /* a=0时; a_addr = (0x1800)+ 0; b_addr = (number * 16) - 0;// 相当于 if (0 = < number < 32) //如果是第1扇区             {                     a_addr = 0x1800;                     b_addr = number * 16;                 } */
回复

使用道具 举报

12#
ID:1006306 发表于 2022-3-21 11:41 | 只看该作者
a=number/32;          //计算倍数关系   0 = < number < 32------------a=0   32 = < number < 64)----------a=1 a_addr = (0x1800)+ (a*0x0200)//是不是 0x0200的倍数,你自己算下哈 b_addr = (number * 16) - (a*0x0200);// /* a=1时; a_addr = (0x1800)+ 0x0200; b_addr = (number * 16) - 0x0200;// 相当于        if (32 = < number < 64) //如果是第2扇区                 {                     a_addr = 0x1A00;                     b_addr = (number * 16) - 0x0200;                 } */
回复

使用道具 举报

13#
ID:612392 发表于 2022-3-21 11:54 | 只看该作者
Y_G_G 发表于 2022-3-20 18:59
精减代码的意义何在?让英文字母减少吗?
我在这论坛第一次看到这样的代码:if (0 = < number < 32),可能是我 ...

很多大厂考核代码行数的,要求精简,能写一行的绝对不写两行。
同时呢,又有很多大厂考核代码行数的,要求工作量,能写两行的绝对不写一行。
回复

使用道具 举报

14#
ID:491577 发表于 2022-3-21 17:57 | 只看该作者
你的变量要设置成长整形的,估计是数据溢出造成数据不对。化成分扇区模式是多余的,为了凑行数吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表