Sweet Snippet 之 Bounce Setting

时间:2022-06-05
本文章向大家介绍Sweet Snippet 之 Bounce Setting,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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,扯淡结束,就这么点东西了 :)