精华内容
下载资源
问答
  • 二进制乘法运算

    2020-09-23 14:01:35
    (2) 获取整数n的二进制中最后一个1: n&~(n-1)或者n&(-n)。例如n=010100,则-n=101100,n&(-n)=000100。 (3) 去掉整数n的二进制中最后一个1: n&(n-1)。例如n=010100,n-1=010011,则n&(n-1)=010000...

    在回答本问题之前,先学习一些有关位运算的知识。

    (1) 常用的等式: -n=~(n-1)=~n+1

    (2) 获取整数n的二进制中最后一个1: n&~(n-1)或者n&(-n)。例如n=010100,则-n=101100,n&(-n)=000100。

    (3) 去掉整数n的二进制中最后一个1: n&(n-1)。例如n=010100,n-1=010011,则n&(n-1)=010000。

    注:对n为正数或者负数都适用。

    先看一个实例:1011*1010,因为二进制运算的特殊性,可以将该乘法运算表达式拆分成两个运算,1011*0010于1011*1000的和。而对于二进制运算,左移一位,等价于乘以0010,左移三位,等价于乘以1000,所以两者的乘积为10110于1011000的和,即为1101110.

    因而乘法可以通过一系列的移位和加法运算完成。最后一个1通过n&~(n-1)求得,可通过n&(n-1)去掉最后一个1,为了高效的得到左移的位数,可提前计算一个map。算法如下,所示:

    #include <iostream>
    #include <map>
    #include <exception>
    using namespace std;
    int multiply(int a,int b){
    	bool neg=(b<0);
    	if(b<0)
    		b=-b;
    	int sum=0;
    	map<int,int> bits;
    	for(int i=0;i<31;i++){
    		bits.insert(pair<int,int>(1<<i,i));
    	}
    	while(b>0){//循环条件
    		int bitshift=bits[b&~(b-1)];//获取移位的次数
    		sum+=a<<bitshift;
    		b&=b-1;//去掉最后的1
    	}
    	if(neg)
    		sum=-sum;
    	return sum;
    }
    int main()
    {
    	cout<<multiply(3,-5)<<endl;
    	return 0;
    }

     

    展开全文
  •   在嵌入式环境中虽然有乘法运算器,而且芯片运算速度越来越快,但位运算还是最快速的,为了提高计算效率,可以将乘法运算使用位运算替换。 原理   乘法可以用按位运算的基本原理,分两步 因式分解: A * (B + ...


      在嵌入式环境中虽然有乘法运算器,而且芯片运算速度越来越快,但位运算还是最快速的,为了提高计算效率,可以将乘法运算使用位运算替换。

    乘法

    原理

      若被乘数是2的整数倍,可以直接进行左移运算,这个比较简单,本文解释下当被乘数不是2的整数倍的情况,乘法进行位运算替换的基本原理,分两步

    1. 因式分解: A(B+C)=AB+ACA * (B + C) = A * B + A * C
    2. 位移替换乘法 :A2n=A&lt;&lt;nA * 2 ^ n = A &lt;&lt; n

    十进制分解

      以10的整数倍为例,进行10进制替换:
    10=8+2=23+2110 = 8 + 2 = 2^3 + 2^1
    100=64+32+4=26+25+22100 = 64 + 32 + 4 = 2^6 + 2^5 + 2^2
    1000=1024168=21024231000 = 1024 - 16 - 8 = 2^{10} - 2^4 - 2^3

    程序示例

    a = 543
    m10 = 10 # 10 = 8 + 2 = 2^3 + 2^1
    m100 = 100 # 100 = 64 + 32 + 4 = 2^6 + 2^5 + 2^2
    m1000 = 1000 # 1000 = 1024 - 16 - 8 = 2^10 - 2^4 - 2^3
    
    am10_cheng0 = a * m10
    am100_cheng0 = a * m100
    am1000_cheng0 = a * m1000
    am10_cheng1 = (a << 3) + (a << 1)
    am100_cheng1 = (a << 6) + (a << 5) + (a << 2)
    am1000_cheng1 = (a << 10) - (a << 4) - (a << 3)
    print ("乘以10:",am10_cheng0,"  ",am10_cheng1)
    print ("乘以100:",am100_cheng0,"  ",am100_cheng1)
    print ("乘以1000:",am1000_cheng0,"  ",am1000_cheng1)
    

    运算结果

      将源码保存为python文件,使用python直接执行可以查看结果,结果如下:
    在这里插入图片描述

    除法

    原理

      跟乘法类似,若分母为2的整数倍,则直接进行右移运算,但若分母不是2的整数倍,则需要对分母进行分解。不过由于除法不能直接分解分母,需要将分母作为独立项进行拆分,除法位运算替换的基本原理,分三步

    1. 分子分母分离:BA=B1A\frac{B}{A} =B * \frac{1}{A}
    2. 分母算术分解: 1A=12n\frac{1}{A} =\sum\frac{1}{2^n}
    3. 位移替换乘法 :B2n=B&gt;&gt;n\frac{B}{2 ^ n} = B &gt;&gt; n

    十进制分解

      由于第二步的分母算术分解不容易,即不容易找到精确解,因此分数分解为12\frac{1}{2}的整数倍的和比较麻烦,而且若需要较高精度则需要更高阶的倍数,即其中的n要很大,以10为例:

    116+132+1256+1512=0.09960.1=110\frac{1}{16} + \frac{1}{32} + \frac{1}{256} + \frac{1}{512} = 0.0996 \approx0.1=\frac{1}{10}

      若在有限位内可以找到精确解,即灯饰两边刚好相等,而不是约等于,则可以进行分解运算,但是这样多运算也许并不比直接除法更快,因此如果除法的分母不是2的整数倍,而且并没有确定的分解方式,可以考虑直接使用除法。

    110116+132+1256+1512+14096=124+125+128+129+1212\frac{1}{10} \approx \frac{1}{16} + \frac{1}{32} + \frac{1}{256} + \frac{1}{512} + \frac{1}{4096} = \frac{1}{2^4} + \frac{1}{2^5} + \frac{1}{2^8} + \frac{1}{2^9} + \frac{1}{2^{12}}

    程序示例

    a = 543
    m10 = 10 
    
    # 1/10 ~= 1/16 + 1/32 + 1/256 + 1/512 + 1/4096 
    #       = 1/2^4 + 1/2^5 + 1/2^8 + 1/2^9 + 1/2^12
    am10_chu0 = int(a / m10)
    am10_chu1 = (a >> 4) + (a >> 5) + (a >> 8) + (a >> 9) + (a >> 12)
    print ("除以10:",am10_chu0,"  ",am10_chu1)
    

    运算结果

      将源码保存为python文件,使用python直接执行可以查看结果,结果如下:
    在这里插入图片描述

    展开全文
  • 二进制乘法运算

    2014-05-03 20:42:03
    1)二进制的加法运算和乘法运算公式都各有四条规则 二进制的加法运算 和乘法运算公式都各有四条规则

    1)二进制的加法运算和乘法运算公式都各有四条规则:

    A)加法

         0+0=0,0+1=1,1+0=1,1+1=10;

    B)乘法

        0*0=0,0*1=0, 1*0=0, 1*1=1


    展开全文
  • 一种二进制乘法的计算方法计算机中数据都以二进制的形式存储,在对数据进行加、减、乘、除运算时计算机需要对二进制数据进行处理,而非人类熟悉的十进制。本文的目的是帮助大家理解计算机数据运算处理的过程,所以以...

    一种二进制乘法的计算方法

    计算机中数据都以二进制的形式存储,在对数据进行加、减、乘、除运算时计算机需要对二进制数据进行处理,而非人类熟悉的十进制。本文的目的是帮助大家理解计算机数据运算处理的过程,所以以较为简单的uint(无符号整数)类型数据为例来介绍它的乘法运算实现过程。本文提供的只是工野思考得出的一种方法,有其他方法和思路欢迎大家讨论。

    b9820896a4ef0882610562fe658a8dc8.png

    一、数据左移n位等于数据乘以基数的n次幂

    在十进制中,一位数字可以表示0-9十种状态,我们将一个数字左移一位,然后在个位补0,会看到结果和这个数字乘以10效果相同。假如我们选取一个数字6,将6左移一位,个位补0,结果如下:

    738dd60de2b46bc76c5fd63bbe80baf9.png

    可以证明数据左移一位,末位补0,等效于该数据乘以1位数据所能表示的数据个数。我们将1位数据所能表示的信息量(数据个数)定义为基数,那么可以有这样的描述:数据左移n位空位补0,等效于该数据乘以基数的n次幂。

    (题外话:能不能给出这样的总结:所谓进制就是1位数据所能表示的信息量呢?比如二进制1位数据可以表示2种状态,八进制1位数据可以表示8种状态,十进制1位数据可以表示10种状态,十六进制1位数据可以表示16种状态……)

    同理,二进制数据也具备同样的性质,二进制每位数据只能表示0或1两种状态,所以二进制数据左移1位,末位补0,等效于该二进制数乘以2。以此类推,左移2位、3位、4位等效于乘以4、8、16……

    • 6*2=12
    12658a0bb377bd228997465e66f9f3d4.png
    • 6*4=24
    2eec2c7131e08d3999b902f95e43f7bb.png
    • 6*8=48
    284d2cca20a3621cda9b84b029772a79.png

    二、uint乘法实现

    uint型数据是计算机(包括计算机、单片机、PLC等)中定义的一种无符号整数数据类型,在不同的系统中占用的位数不同,这里我们规定,本文的uint型数据占用8位数据。

    在上文的推论中我们可知,当数据的乘数正好等于基数的x次幂时(x为正整数),相当于被乘数左移x位,在空位补0。

    那如果乘数不等于基数的x次幂时,又是什么情况呢?比如二进制数6乘以二进制数5,常规计算过程如下:

    9b84a4cb0e66200167c714058d53f91d.png

    根据数学运算法则,我们可将二进制6*5写成6*(4+1)=6*4+6*1,如下图:

    ab2eb47d7d7d13005b1aa53b63eae9c6.png

    这样我们将常规计算过程转换为了简单的移位问题,在二进制中1等于2的0次方,4等于2的2次方,所以计算如下:

    6e2b361599bf5e3c2433ac687c437ad9.png

    可以证明,在二进制中任何数都可以转换为2的某次幂+2的某次幂+……之和,比如15的二进制表示为1111=1000+0100+0010+0001=2^3+2^2+2^1+2^0=8+4+2+1=15。

    所以在程序中,只需将乘数二进制为1的位,按照上述方法对被乘数移位,最后将所有移位结果相加即可得到无符号整数相乘的结果。

    三、计算溢出的判断

    由于uint型数据的位数限制,当两数相乘的结果大于uint能表示的最大值时,将产生溢出,得到错误的结果。这是我们程序中不希望出现的情况,或者出现后必须进行处理的情况。那如何判断溢出的发生呢?

    按照上文的计算方法,我们将无符号整数的乘法转换为了移位和加法问题。移位时被移出的位将被丢掉,因此,如果被移出的位中有为1的位,我们则可认为发生了数据溢出。在进行加法运算时,当最高位相加需要进位时,我们也可以认为发生了数据溢出,因为最高位的进位也将被丢掉。

    以施耐德PLC为例(工野的看家饭碗),在进行移位运算时,以系统位%S17存储本次移出的最高位,如果在执行移位过程中任何一次此位为1,我们则可认为发生了数据溢出。在进行加法运算时,以系统位%S18存储加法运算的溢出状态,当此位为1,则发生了数据溢出。

    在其它系统中也存在类似的系统状态位,大家在编程时可参考此方法判断数据溢出。

    更多工控经验分享,欢迎关注"工控领域野钓人"。

    展开全文
  • 二进制乘法

    2020-10-26 15:16:23
    二进制乘法器 关注我的公众号c137Lab获取更多相关内容 “手动计算乘法” 两个 NNN 位二进制数 XXX 和 A=∑k=0N−1ak2kA=\sum^{N-1}_{k=0}a_k2^kA=∑k=0N−1​ak​2k 的乘法可以用如下的方式计算: P=AX=∑k=0N−1ak...
  • 这一节主要介绍二进制加法、二进制减法、二进制乘法、二进制除法以及二进制反码、补码等知识。一 二进制加减乘除前面二进制的加减乘除这部分比较基础,也很直接,我就直接复制粘贴老师的PPT了。二 原码、反码和补码...
  • 二进制乘法实现方法不难,模拟手动运算的思想,之所以选用字符串实现是因为字符串在移动方面性能显著,代码运用知识十分基础,希望可以给大家一个参考。 函数部分 思来想去,本来弄了好几个函数,但是发现有些...
  • 进制乘法 位移运算 的表示

    千次阅读 2018-08-21 09:39:52
    预备知识: 4(十进制) * 2 = 100(二进制) * 2 = 100(二进制) &lt;&lt; 1(左移一位) = 1000(二进制) = 8 (十进制) 可以自行演示4(十进制)* 4 ; 得到的结论为 左移 1 位,即乘以2,左移两...
  • 一种二进制乘法的计算方法计算机中数据都以二进制的形式存储,在对数据进行加、减、乘、除运算时计算机需要对二进制数据进行处理,而非人类熟悉的十进制。本文的目的是帮助大家理解计算机数据运算处理的过程,所以以...
  • 撰文:茂喵喵审核:伯毅在数学学习中,我们比较常用的是十进制,这在生活中也是一样。所谓十进制,就是在进行数字运算时,低位上的数字运算满十向上进位,或者低位上的数字不足时向高一位的...因此,二进制中,只...
  • ## 线上实验五:2个2位二进制乘法

    千次阅读 2020-08-05 19:22:48
    线上实验五:2个2位二进制乘法器 一、实验目的 设计一个乘法器, 实现两个四位二进制数的乘法。 两个二进制数分别是被乘数 AB和乘数CD。被乘数和乘数这两个二进制数分别由高低电平给出。 乘法运算的结果即乘积由一...
  • 为什么二进制乘除法可以转换成移位运算呢? 如: a=5; a=a*9; 可以转换成a=(a a=a*7 可以转换成a=(a a=a/12; 可以转换成 a=(a>>4)-(a 因为乘除和减法都能转换成移位和加法运算,所以cpu中只需要一个...
  • 这一节主要介绍二进制加法、二进制减法、二进制乘法、二进制除法以及二进制反码、补码等知识。一 二进制加减乘除前面二进制的加减乘除这部分比较基础,也很直接,我就直接复制粘贴老师的PPT了。二 原码、反码和补码...
  • 修改的王金明Verilog HDL 8*8位2进制乘法。。自己的想法,从最高位开始运算,王老师从最低位开始运算
  • 从最基础的莫尔斯编码到二进制,基础电路和布尔逻辑运算的神奇结合。产生了目前人类最伟大的发明-计算机。二进制(binary)二进制的提出者是德国数学家莱布尼茨,他和牛顿发现了高等数学中的微积分。用二进制记数只...
  • 二进制常用运算简介:逻辑变量之间的运算称为逻辑运算二进制数1和0在逻辑上可以代表“真”与“假”、“是”与“否”、“有”与“无”。这种具有逻辑属性的变量就称为逻辑变量。 计算机的逻辑运算的算术运算的主要...
  • 二进制逻辑运算

    千次阅读 2017-09-29 16:14:44
    逻辑加法(“或”运算)逻辑加法通常用符号“+”或“∨”来表示。逻辑加法运算规则如下: 0+0=0, 0∨0=0 0+1=1, 0∨1=1 1+0=1, 1∨0=1 ...逻辑乘法(“与”运算)逻辑乘法通常用符号“×”或“∧”
  • Verilog实现有符号数乘法运算二进制运算原理1、无符号二进制数(signed)运算 二进制运算原理 总结最近FPGA的学习,使我明白了一件事:在Verilog程序的编写中,“位”(bit)这一概念,对于程序编写至关重要,...
  • 原码一位乘法运算 今天自己遇到的和大家分享分享(语句比较啰嗦,希望耐心看完,对你会有所影响,哈哈哈) 主要思想:符号位单独参加运算,数据位取绝对值参加运算。 运算法则: 设: [X]原=X0.X1X2…Xn [Y]原=Y0. ...
  • 关注并标星大同学吧每周1次,打卡阅读快速获取行业最新资讯经验犹如一盏明灯的光芒它使早已存在于头脑中朦胧的东西豁然开朗全文共1418字,预计阅读4分钟笔经面经(第26期)根据乘法运算的原理可知:乘法运算最终可分解...
  • 运算规则 . 加法 注:我们在算负数的补码的时候,是符号位不变,剩下的取反加一 但是在算 [-x] 的补码的时候,所有位都要取反 例: 三. 乘法 注:部分积从0.0000开始,然后从双下划线开始乘A,之后与...
  • 1. 左移位指令2.右移位指令3.循环左移位4.循环右移位5.寄存器移位(1)左移位指令原理:使能输入有效时,将输入IN的无符号数字节、字或双字中的各位向左移N位后(右端补0),将...作用:左移位具有二进制乘法运算作用...
  • 2)二进制的简写形式二、进制运算1)八进制运算表(1) 加法运算表(2)乘法运算表(3)八进制简单运算题三、数据宽度1)什么是数据宽度2)计算机中常用的基本数据宽度四、无符号数有符号数 进制 进制也就是进位计数制,...
  • 小古银的官方网站(完整教程):http://www.xiaoguyin.com/ ... 目录 目录 ...二进制乘法和除法 左移运算和右移运算 基础示例 基础讲解 与运算运算 异或运算 取反运算 基础示例 基础讲解 运...
  • 二进制逻辑运算详解

    2009-08-17 19:04:43
    二进制数1和0在逻辑上可以代表“真”与“假”、“是”与“否”、“有”与“无”。这种具有逻辑属性的变量就称为逻辑变量。 计算机的逻辑运算的算术运算的主要区别是:逻辑运算是按位进行的,位与位之间不像加减运算...
  • <h2>JS 使用二进制运算的一些例子 我举得例子肯定不全,欢迎大家头脑风暴~ | 运算符 | 用法 | 描述 | | --- | --- | --- | | 按位与(AND) | <code>a & b</code> | 对于每一个比特位࿰...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 812
精华内容 324
关键字:

二进制乘法运算