level 15
月城翁
楼主
诌议布尔运算∧∨⊕
用乘和加分别代替布尔运算的∧和∨可以与其它非布尔运算无缝融合,并且使算式简洁,比if好用。问题是用什么非布尔运算来代替布尔⊕呢?
且看下面的比较:
a b a∧b a·b a∨b a+b a⊕b
0 0 0 0 0 0 0
0 1 0 0 1 1 1
1 0 0 0 1 1 1
1 1 1 1 1 2 0
从上表可以看出,用乘法代替∧是完全等价的,没有问题。问题出在加法上。最后一行a+b=2,是true,还是false?
这就要看当时的使用环境来决定了。
对于
if a+b then ... otherwise ...
是把a+b当作true在用,所以这里的a+b=2等价于a+b=1,所以加运算和或运算就等价了。
但是,对于
(-1)^(a+b)
因为(-1)^0=1和(-1)^2=1是等价的,所以,这时a+b就等价于a⊕b了。
因为这个原因,在用加法代替布尔运算的"?或"时可要特别留意,以免出错。
我在https://tieba.baidu.com/p/3463042030的29楼中的程序板的倒数第3行用到:
(-1)^(mod(v,4)>1)+mod(u,2)
就应该是:
(-1)^(mod(v,4)>1)⊕mod(u,2)
但是从幂指数的运算的角度来说,用+来得更自然,在必要时更容易分割成两个指数算式。
2014年12月16日 03点12分
1
用乘和加分别代替布尔运算的∧和∨可以与其它非布尔运算无缝融合,并且使算式简洁,比if好用。问题是用什么非布尔运算来代替布尔⊕呢?
且看下面的比较:
a b a∧b a·b a∨b a+b a⊕b
0 0 0 0 0 0 0
0 1 0 0 1 1 1
1 0 0 0 1 1 1
1 1 1 1 1 2 0
从上表可以看出,用乘法代替∧是完全等价的,没有问题。问题出在加法上。最后一行a+b=2,是true,还是false?
这就要看当时的使用环境来决定了。
对于
if a+b then ... otherwise ...
是把a+b当作true在用,所以这里的a+b=2等价于a+b=1,所以加运算和或运算就等价了。
但是,对于
(-1)^(a+b)
因为(-1)^0=1和(-1)^2=1是等价的,所以,这时a+b就等价于a⊕b了。
因为这个原因,在用加法代替布尔运算的"?或"时可要特别留意,以免出错。
我在https://tieba.baidu.com/p/3463042030的29楼中的程序板的倒数第3行用到:
(-1)^(mod(v,4)>1)+mod(u,2)
就应该是:
(-1)^(mod(v,4)>1)⊕mod(u,2)
但是从幂指数的运算的角度来说,用+来得更自然,在必要时更容易分割成两个指数算式。


