Javascript 从真值表构建数字乘数的通用规则
我有一些真值表,主要是基于0,1,-1,我用于数学运算: 例1:Javascript 从真值表构建数字乘数的通用规则,javascript,bit-manipulation,Javascript,Bit Manipulation,我有一些真值表,主要是基于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
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);
我想转换第二个真值表,仅使用数学或位运算符,如何实现
有什么通用规则可以轻松创建这种单行表达式吗?如果
a
总是1
或-1
,b
总是1
或0
,并且可以使用布尔运算符(|
),那么
应该这样做
const c=(a,b)=>b|a
log(c(1,1))//1
console.log(c(1,0))//1
console.log(c(-1,1))//1
log(c(-1,0))/-1
您可以使用一个通用的超级优化程序,比如我写的这个(不幸的是,它不是非常友好):
这将为第一个示例提供(a+b)>>31
,为第二个示例提供((a+b)| b)&a
对于更系统的方法,您可以通过
(x>>1)+1
将-1/1转换为0/1,使用&^
执行常规逻辑运算,然后(如果需要)通过x^(x-1)
将0/1转换为-1/1。顺便说一句,您在代码中没有布尔值。除了显示的值,你还能有其他值吗?@NinaScholz:正确,我不想要布尔值,结果应该是数字的,这样我就可以在下一个数学运算中直接使用它。“真值表”和“位操作”通常指的是二进制逻辑。看来你有三元逻辑?@Bergi:也许吧。我通常使用0和-1作为falsy,但并不总是这样。通常一次只涉及这三个开关中的两个:0/1或-1/1我仍然对涉及所有三个值的一些通用实现规则感兴趣,如果这是您的意思,并且您有一些提示,那就太好了。TBH我认为您的if
级联是最干净和可读的,特别是因为它不是一个完整的函数(9种情况下!-a==0
和b==1
),我知道我可以在最后使用数字(布尔值)转换它,但我要求一个数学表达式。@deblocker关于数字(布尔值)
呢?我真的不明白你的意思。。。我的示例将返回一个数字,而不是布尔值,这太棒了!
c = b || a