本文共 946 字,大约阅读时间需要 3 分钟。
1. 题记
又是一篇Sweet Snippet,自己看来都觉得过小,不足以成篇,不过自觉有些趣味,也就随便记一记了,权当自娱自乐 :)
2. 问题
程序中有时会用到所谓Bounce Setting这种技巧,目的是为了解决一些变量的“来回”设置问题,譬如一个布尔变量,最直观的Bounce Setting方法大概是这个样子:
if (boolFlag) { boolFlag = false;}else { boolFlag = true;}
以上代码虽说直观,但是仍然存在不少问题:譬如效率不高,分支判断代价高昂,再如代码表述略显累赘,不够简洁等等。一种更好的表达方式大概是这个样子:
boolFlag = !boolFlag;
这种表达个人觉得非常聪明,很早之前自己便默默的记于心头了,每当遇到类似代码,总会不自觉的想起这个简洁美观的表达方式,近日在也看到了类似的代码,不过其中使用了整形变量1和0,相关的代码大概是这个样子:
value = 1 - value;
看到之后突然觉得自己以前一直囿于布尔变量取非这么一种Bounce Setting的形式,而实际上,像上述的这种表达方法也是不错的思路,那么对于任意整数A、B,是否总是存在类似的这种表达式来优雅的完成Bounce Setting呢?不知你目前对此有什么想法,反正这个问题一开始是把我懵住了,但实际上,答案要比我想象的简单得多 :)
3. 道理
假设表达式为一元一次多项式,不妨记为 f(x) = ax + b
那么其应该满足的条件其实就是:
(1) f(A) = aB + b
(2) f(B) = aA + b
经过一番高斯消去求解,我们得到 a = -1,b = A + B,于是有:
f(x) = A + B - x
嘿嘿,不知你看到这个表达式有什么想法,反正我是觉得挺好笑的,本来以为会是一个稍有繁复的公式,不想却是一个简单的能够一眼望穿的家伙,而自己一开始竟然也毫无察觉,着实好笑 :)
废话打住,依据上述公式,任意整数间的Bounce Setting 方法直接套用即可,譬如说 A = 1、B = 0 那么自然有:
f(x) = 1 + 0 - x = 1 - x
OK,扯淡结束,就这么点东西了 :)
转载地址:http://jizqi.baihongyu.com/