Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从真值表构建数字乘数的通用规则_Javascript_Bit Manipulation - Fatal编程技术网

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

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

我有一些真值表,主要是基于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);
我想转换第二个真值表,仅使用数学或位运算符,如何实现


有什么通用规则可以轻松创建这种单行表达式吗?

如果
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