从真值表构建数字乘数的通用规则

Generic rules to build numeric multipliers from truth tables

我有一些道理 tables,主要是 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);

我也想仅使用数学或按位运算符转换第二个真理 table,如何实现?

是否有任何通用规则可以轻松创建这种单行表达式?

如果 a 始终是 1-1 并且 b 始终是 10,您可以使用布尔运算符 (||),然后

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

你可以使用一个通用的超级优化器,比如我写的这个(不幸的是用户不是很友好):https://github.com/falk-hueffner/sematrope

这将为您提供第一个示例 (a + b) >>> 31,第二个示例 ((a + b) | b) & a

对于更系统的方法,您可以通过 (x >> 1) + 1 将 -1/1 转换为 0/1,使用 |&^ 进行常规逻辑运算,然后(如果需要)将 0/1 转换为通过 x ^ (x - 1).

到 -1/1