我有一些真值表,主要是AND,基于0,1,-1,我用它来进行数学运算。
例1:
var a,b,c;
if(a == 1 && b == 1) c = 0;
if(a == 1 && b == 0) c = 0;
if(a == -1 && b == 1) c = 0;
if(a == -1 && b == 0) c = 1;
例2:
var a,b,c;
if(a === 1 && b === 1) c = 1;
if(a === 1 && b === 0) c = 1;
if(a === -1 && b === 1) c = 1;
if(a === -1 && b === 0) c = -1;
例如,第一个真值表可以表达如下:
c = (a>>1)*(b-1);
我想把第二个真值表也转换为只用数学或位智运算符的真值表,怎么做?
有没有什么通用的规则可以轻松地创建这样的单行表达式?
你可以使用一个通用的超级优化器,比如我写的这个(不幸的是不太友好)。https:/github.comfalk-hueffnersematrope
这将给你 (a + b) >>> 31
对于你的第一个例子和 ((a + b) | b) & a
为第二种。
如果想要更系统的方法,你可以通过以下方法将-11转换为01 (x >> 1) + 1
,做常规的逻辑运算,用 |&^
然后(如果需要)通过以下方法将01转换为-11 x ^ (x - 1)
.
如果 a
总是 1
或 -1
和 b
总是 1
或 0
,你可以使用布尔运算符(||
),那么
c = b || a
应该这样做...
const c = (a, b) => b || a
console.log(c( 1, 1)) // 1
console.log(c( 1, 0)) // 1
console.log(c(-1, 1)) // 1
console.log(c(-1, 0)) //-1