搜索
bottom↓
回复: 166

这是一个非常短的呼吸灯程序

  [复制链接]

出0入93汤圆

发表于 2013-3-27 15:29:39 | 显示全部楼层
本帖最后由 takashiki 于 2013-3-27 15:41 编辑
doujiang 发表于 2013-3-26 12:16
三元运算符实际上也是if语句的缩写式,但是这个程序里的方法完全就用加法和逻辑运算代替了if语句,是一个 ...


你这个还是用到了判断,而且比三元运算符更多……,LED == 0 和 LED == 1 都是判断

真要Kill掉判断,应该这样写:delay(t*LED+(limit-t)*(1 - LED));
不好意思,写成这样已经非常变态了。更变态一点,就是将括号里面展开,代替编译器进行计算,变成delay((t*2-limit) * LED + limit - t),可以少掉一次乘法,不过这样写不作注释基本上是看不懂了。

由于用到了16位的乘法,它的开销比逻辑运算要大得多,因此采用这种所谓的“技巧”根本是不可取的。

出0入93汤圆

发表于 2013-3-28 12:31:58 | 显示全部楼层
doujiang 发表于 2013-3-27 19:09
这个,你只考虑到这条代码在呼吸灯里的运用,但是如果状态有三种以上呢?不用逻辑判断就不行了。这个代码 ...

N多个状态一样可以用超长的表达式来解决,数学上有一种术语叫做分段函数,一般情况下我们是将它们按照自变量的取值范围分成若干段,然后组合而成,这样就有多个函数式。但也有人非得把各种分段都统一到一条语句中去,这样既长又不好理解。
用数学的观点来解决计算机的问题是不对的,数学可以用来解决计算机的问题,但是纯数学的观点只会走弯路。

下面我举一个例子,把简单问题复杂化,很复杂,一步一步的进行复杂,也是我所不推崇的

这么一个简单函数,他只完成这么个功能,计算一个Byte的十进制数有多少位:
  1. unsigned char TestFunc(unsigned char x){
  2.       return (x >= 100) ? 3                            //大于等于100的具有3位数字
  3.              : (x >= 10) ? 2                             // 10~99的具有2位
  4.              : 1;                                             // 0~9只有1位
  5. }
复制代码
现在我们将它复杂化,使用数学上的分段函数表述,这里有三个区间,分别是[0, 9], [10, 99], [100, 255],因为是离散的,我都写成闭区间了,如果是连续的(比如实数),那就必须要写成半开半闭。
首先考虑[100, 255]区间,结果是3,得到如下表达式,为了书写方便,我用y表示返回值:
[ocde] y = 3 * ((x + 156) >> 8);[/code]

x + 156在x>=100是会产生进位,而<100则不会,因此 ((x + 156) >> 8)在大于等于100时是会等于3的,上述表达式成立。

接来下,我就要计算x<100的值了,因为上述表达式在x<100时只能等于0。

继续考虑,分段的第二段,x为[10, 99]区间。
显然:
  1. y = 2 * ((x+246) >> 8)
复制代码
是会在这个区间上成立的,但是当x>=100时,它也仍然成立,因此需要去除。去除后的结果是:
  1. y = 3 * ((x + 156) >> 8) + (1 - ((x + 156) >> 8)) * ( 2 * ((x+246) >> 8));
复制代码
好了,分段2完成,以此类推,直至完成。
  1. y = 3 * ((x + 156) >> 8) + (1 - ((x + 156) >> 8)) * ( 2 * ((x+246) >> 8)) + (1 - ((x + 246) >> 8)) * 1;
复制代码
N段的一样这样完成,你看我连一个判断都没有,但是这个有什么意义呢?不写注释能看懂的都是神人。难道就是你所谓的一种方法?

出0入93汤圆

发表于 2013-3-28 12:58:24 | 显示全部楼层
如果楼主喜欢收集各种技巧,那我再给你一个技巧吧,只在51上可用,效果那是非常明显,不过看得人要骂人就是了。
P1.0在y>=x时输出高电平,y<x时输出低电平,那么可以写作:
  1. P1_0 = (ACC = x - y, CY);
复制代码
哈哈,这个如何?代码特别短,效率特别高。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 13:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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