Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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_Logic_Multiplication_Circuit - Fatal编程技术网

如何在JavaScript中实现乘法器电路

如何在JavaScript中实现乘法器电路,javascript,logic,multiplication,circuit,Javascript,Logic,Multiplication,Circuit,TBH我很难理解逻辑门图,因为我还没有完全理解低级电子设备以及它们是如何工作的 我有一点学习基本逻辑门的经验,在看了一些视频并思考了很多之后,在它消失之前,我能理解它几分钟 但后来我看到了一些在软件中实现的逻辑门的例子,这使发生的事情更有意义。例如 然后我甚至能够进一步了解a的工作原理,如: 与逻辑图相比,这是非常基本的 现在我想了解和是如何在逻辑门中实现的,比如x86的操作符 function MUL(a,b){ return { ... }; } 我真的不知道从哪里开始,除

TBH我很难理解逻辑门图,因为我还没有完全理解低级电子设备以及它们是如何工作的

我有一点学习基本逻辑门的经验,在看了一些视频并思考了很多之后,在它消失之前,我能理解它几分钟

但后来我看到了一些在软件中实现的逻辑门的例子,这使发生的事情更有意义。例如

然后我甚至能够进一步了解a的工作原理,如:

与逻辑图相比,这是非常基本的

现在我想了解和是如何在逻辑门中实现的,比如x86的操作符

function MUL(a,b){
  return {
    ...
  };
}

我真的不知道从哪里开始,除了花一些时间去理解乘法器电路,并尝试使用上面的例子将其转换成一个与非门实现。想知道知道这一点的人是否可以用JavaScript演示实现。

乘法依赖于二进制编码的方式。 如果A是无符号的,并由位A_n-1、A_n-2、…、A_1、A_0编码,则其值为 A=A_n-1*2^n-1+A_n-2*2^n-2+…+A_1*2^1+A_0

所以要乘以A×B,你必须 A×B=A×B_n-1*2^n-1+B_n-2*2^n-2+…+B_1*2^1+B_0 =A×b_n-1*2^n-1+A×b_n-2*2^n-2+…+A×b_1*2^1+A×b_0 乘法只是一个大的加法,其中每个项a×b_i*2^i要么是a×2^i,如果b_i==1,要么是0,如果b_i==0

这是一个C语言的实现


int mult(unsigned short A, unsigned short B){
  int res=0;
  int mask=0x1;
  for(int i=0; i<16;i++,mask<<=1){
    if(B&mask)
      res += (A << i);
  }
  return res;
}
这或多或少是一个简单的乘法器在硬件中的外观,一旦循环展开。 您可以在js中实现它,用一个用门完成的加法器替换+并使用模拟与门

实际上,硬件乘数要复杂一些

他们使用一个特殊的加法器,无需进位传播,以减少加法时间,节省进位加法。这需要在计算结束时进行额外的添加

他们经常使用base 4来减少添加步骤的数量,从而改进Booth算法

它们通过流水线来提高吞吐量

顺便说一句,您可能会对这些不同的计算机算术算法感兴趣。

也许这会有所帮助?可选进位逻辑:c:oranda,b,anda,c,andb,c/c:nanda,b,nanda,c,nandb,cI想了解[除法]是如何在逻辑门中实现的,祝你好运。

int mult(unsigned short A, unsigned short B){
  int res=0;
  int mask=0x1;
  for(int i=0; i<16;i++,mask<<=1){
    if(B&mask)
      res += (A << i);
  }
  return res;
}
int mult(unsigned short A, unsigned short B){
  int res=0;
  int mask=0x1;
  for(int i=0; i<16;i++,mask<<=1){
     res += (A&~(((B&mask)>>i) -1))<<i;
  }
  return res;
}
int mult(unsigned short A, unsigned short B){
  int res=0;
  int mask=0x1;
  for(int i=0; i<16;i++){
     res += A&~((B&mask) -1);
     A <<= 1;
     B >>= 1;
  }
  return res;
}