从真值表构建数字乘数的通用规则
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
始终是 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
你可以使用一个通用的超级优化器,比如我写的这个(不幸的是用户不是很友好):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
我有一些道理 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
始终是 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
你可以使用一个通用的超级优化器,比如我写的这个(不幸的是用户不是很友好):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)
.