|
doujiang 发表于 2013-3-27 19:09
这个,你只考虑到这条代码在呼吸灯里的运用,但是如果状态有三种以上呢?不用逻辑判断就不行了。这个代码 ...
N多个状态一样可以用超长的表达式来解决,数学上有一种术语叫做分段函数,一般情况下我们是将它们按照自变量的取值范围分成若干段,然后组合而成,这样就有多个函数式。但也有人非得把各种分段都统一到一条语句中去,这样既长又不好理解。
用数学的观点来解决计算机的问题是不对的,数学可以用来解决计算机的问题,但是纯数学的观点只会走弯路。
下面我举一个例子,把简单问题复杂化,很复杂,一步一步的进行复杂,也是我所不推崇的
这么一个简单函数,他只完成这么个功能,计算一个Byte的十进制数有多少位:- unsigned char TestFunc(unsigned char x){
- return (x >= 100) ? 3 //大于等于100的具有3位数字
- : (x >= 10) ? 2 // 10~99的具有2位
- : 1; // 0~9只有1位
- }
复制代码 现在我们将它复杂化,使用数学上的分段函数表述,这里有三个区间,分别是[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]区间。
显然:是会在这个区间上成立的,但是当x>=100时,它也仍然成立,因此需要去除。去除后的结果是:- y = 3 * ((x + 156) >> 8) + (1 - ((x + 156) >> 8)) * ( 2 * ((x+246) >> 8));
复制代码 好了,分段2完成,以此类推,直至完成。- y = 3 * ((x + 156) >> 8) + (1 - ((x + 156) >> 8)) * ( 2 * ((x+246) >> 8)) + (1 - ((x + 246) >> 8)) * 1;
复制代码 N段的一样这样完成,你看我连一个判断都没有,但是这个有什么意义呢?不写注释能看懂的都是神人。难道就是你所谓的一种方法? |
|