精华内容
下载资源
问答
  • 二进制怎么乘法运算
    千次阅读
    2021-09-08 14:16:53

    2.3.2 定点原码两位乘

    讨论x * y = z 采用原码两位乘法,已知x和y,如何求得z

    原码两位乘法和原码一位乘法一样,符号位不参加运算
    部分积和被乘数x均采用三位符号,乘数y末位每次要加一个c,c一开始是0
    根据如下法则进行运算:

    操作C值变化
    000部分积加0,    右移两位0
    001部分积加|x|, 右移两位0
    010部分积加|x|, 右移两位0
    011部分积加2|x|,右移两位0
    100部分积加2|x|,右移两位0
    101部分积减|x|, 右移两位1
    110部分积减|x|, 右移两位1
    111部分积加0,    右移两位1


    而乘数y用双符号还是单符号表示得根据乘数y的数值的奇偶性判断,而且最后一步移位与否也与乘数y的数值的奇偶性有关:
    · 如果乘数y的尾数n的位数为偶数,则乘数y用双符号表示,最后一步不移位
    · 如果乘数y的尾数n的位数为奇数,则乘数y用单符号表示,最后一步要移一位
    根据以上步骤我们就可以求得x * y的源码。

    举个栗子~(栗子真的超好吃的啊啊啊啊呀~)

    例如:x = -0.1101,y = 0.0110,求[x*y]原。

    符号位是不参与运算哒,所以已经知道最后的结果是负啦~

    先写出|x|和2|x|的值再说,用三位符号位表示哦~:
    |x| = 000.1101, 2|x| = 001.1010

    因为y的尾数n有4位是偶数,所以乘数y要用双符号表示,而且最后一步是不用移位的~
    所以 |y| = 00.0110

    一开始部分积为 000.0000,乘数为00.01100(先在末尾加个c,c一开始是0)

    此时y = 00.01100的最后三位是100,根据运算法则,加2|x|:
    000.0000 + 001.1010 = 001.1010

    对部分积右移两位,得到:000.011010,而乘数c变成了0,y移动三位,c添加在末尾,所以此时的乘数变为了00.010,最后三位是010

    根据运算法则,加|x|:部分积加0,     右移两位
    000.011010 + 000.1101 = 001.001110

    右移两位,得到:000.01001110,而乘数c变为了0,y移动三位,c添加在末尾,所以此时的乘数变为了00.0,因为最后三位是000

    因为这已经是最后一步了,因为y是偶数所以最后一步不用移位~

    这样的话,外加前面已知的符号位是负号,就可以得知最后结果[x * y]原 = -1.01001110
    ————————————————
    以上来源于CSDN博主「柳婼」的原创文章(有修改)
    原文链接:https://blog.csdn.net/liuchuo/article/details/52922479

    这里我需要再加一个例子,还有遇到-x时情况:

    例题:用原码两位乘计算X*Y 。x=1100,y=-0111

    符号结果为负.

    先写出 |x| = 00011002|x| = 0011000,这题里需要用到-x,计算机中-X*的操作可以由+[-X*]补 来替代,也就是+[-X]补 = 1110100.(原码转补码)

    一开始部分积为0000000,y=0111,c=0,那么y结尾加c取到的应该为110,所以需要加[-X]补,部分积:

    0000000+1110100=1110100右移两位:1111101,此时c变为1

    y结尾加c取为011,需要加2|x|,部分积:

    1111101+0011000=0010101,右移两位:0000101,此时c变为0;

    此时已经y取完了(注意最后一次移位后,若c=1,需要补充一次+|x|的操作),加上符号位1⊕0=1,所以X*Y= -1010100

    更多相关内容
  • 二进制乘法运算

    千次阅读 2022-04-10 00:23:01
    二进制乘法运算前言一、定点数一位乘法1.定点原码一位乘法2.定点补码一位乘二、定点数二位乘法1.引入库2.读入数据总结 前言 一、定点数一位乘法 1.定点原码一位乘法 ➢ 乘积的符号为相乘两数符号的异或值,数值则为...


    一、定点数一位乘法

    1.定点原码一位乘法

    ➢ 乘积的符号为相乘两数符号的异或值,数值则为两数绝对值之积
    ➢人工计算特点
    ◆ 乘积位数是乘数的二倍
    ◆ 相加数逐次向左偏移一位
    ◆ 前一部分积的最低位不再参与运算
    在这里插入图片描述
    机器计算需要解决哪些问题?
    ◆ 如何解决多个数据同时相加?
    ◆ 如何保存2N位乘积结果?

    解决方法(1) ◆ 设置寄存器
    ➢ A寄存器:部分积
    ➢ B寄存器:被乘数
    ➢ C寄存器:乘数
    解决方法(2) ◆ 每求得一个相加数,就与上次部分积相加
    ◆ 利用N位加法器实现两个N位数相乘。
    ➢ 在求本次部分积时,前一次部分积的最低位不再参与运算,因此可将其右移一位。
    ➢ 乘数最低位用完也没有用处了。乘数寄存器同时右移一位。
    ◆ A寄存器中保存乘积的高位部分,C寄存器中保存乘积的低位部分。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    得出结果:
    在这里插入图片描述
    原码乘法是先取操作数绝对值相乘,符号位单独处理。

    2.定点补码一位乘

    在这里插入图片描述

    定点补码一位乘法的规则
    设被乘数 [X]补 = X0. X1X2… Xn
    ◆ 乘数 [Y]补 = Y0. Y1Y2… Yn
    则 [X . Y]补 = [X]补(0. Y1Y2… Yn) - [X]补. Y0

    例1: [X . Y]补 = [X]补(0. Y1Y2… Yn) - [X]补. Y0(其中Y0=0)
    在这里插入图片描述
    答案为:[X . Y]补 = 1.01110001 X . Y = -0.10001111
    例2: [X . Y]补 = [X]补(0. Y1Y2… Yn) - [X]补. Y0(其中Y0=1)
    在这里插入图片描述
    答案为:[X . Y]补 = 0.10001111
    例3:
    在这里插入图片描述
    根据补码一位乘公式 [X . Y]补 = [X]补(0. Y1Y2… Yn) - [X]补. Y0可知,当Y0=0时,需要进行n次加法运算;Y0=1时,需要进行n+1次加法运算。故最多需要n+1次。(n以乘数y的位数为准)

    3.布斯公式

    在这里插入图片描述
    需要在乘数最后一位增加一位“0”,Y0也参加运算。
    在这里插入图片描述

    二、定点数二位乘法

    1.原码两位乘法

    左移一位相当于乘2,右移一位相当于除2。(此处需要结合例题反复理解)
    在这里插入图片描述
    在这里插入图片描述
    例:
    在这里插入图片描述
    如果最后一次操作欠下+4X,则最后一次右移两位后还需补充+X操作,+X后不再移位。

    2.补码两位乘法

    根据前述的布斯算法,将两步合并成一步,可推导出补码两位乘的公式。
    需要在乘数最后一位增加一位“0”,Y0也参加运算。

    符号位参与运算,部分积与被乘数采用三符号位;乘数Y数值的位数为偶数设两个符号位;为奇数设一个符号位。
    根据Yn-1 , Yn ,Yn+1判断
    Yn-1 Yn Yn+1 组合
    0 0 0 0 部分积+0,右移两位
    0 0 1 1 部分积+[X]补,右移两位
    0 1 0 1 部分积+[X]补,右移两位
    0 1 1 2 部分积+2[X]补,右移两位
    1 0 0 -2 部分积+2[-X]补,右移两位
    1 0 1 -1 部分积+[-X]补,右移两位
    1 1 0 -1 部分积+[-X]补,右移两位
    1 1 1 0 部分积+0,右移两位
    详情参考文章:补码两位乘法

    例(同上布斯公式例3.34)用补码两位乘法处理
    在这里插入图片描述

    三、阵列乘法器

    在这里插入图片描述
    了解详情可参考文章:阵列乘法器


    展开全文
  • 正数乘法可直接运算,去除乘数和被乘数的符号位进行相乘,结果为10bit(如果位数不够,最高位加0),符号位为乘数和被乘数符号位取异或。 如图为:0.78125(011001)×0.75(011000) 结果位宽为11bit。 、正数×...

    此次采用有符号位宽为6bit的输入变量in_a和in_b。其中最高位为符号位,“0”表示正数,“1”表示负数。低5bit表示小数位。所有数据范围均为-1~1之间。
    一、正数×正数
    正数乘法可直接运算,去除乘数和被乘数的符号位进行相乘,结果为10bit(如果位数不够,最高位加0),符号位为乘数和被乘数符号位取异或。
    如图为:0.78125(011001)×0.75(011000)

    结果位宽为11bit。
    二、正数×负数
    1、进行乘法之前,首先将负数转化为正数再进行运算(补码)。
    方法:负数整个按位取反再加一。
    2、再按两个正数相乘的方法进行运算(即乘数和被乘数去除符号位相乘)(如果不够,根据符号位添加,如果符号位为“1”,则最高位添加“1”)
    3、结果的符号位也是乘数,被乘数取异或运算。
    4、如果符号位为“1”,则步骤2相乘的结果最高位补位为“1”,符号位为“0”,最高位补“0”,凑够10bit位宽(如果步骤2结果本来为10bit,则不需要添加)。
    5、添加符号位,结果为11bit,最高位符号位,低10bit为小数位。
    如图:eg:111001(-0.21875)×011000(0.75)
    在这里插入图片描述
    ps:负数×负数与上述方法一样,不一一列举。

    展开全文
  • 二进制乘法、除法的计算过程解读

    千次阅读 多人点赞 2021-01-18 20:55:11
    本文包括4位二进制乘法(4位乘4位)和8位二进制除法(8位除4位)的详细计算过程。 1.创作原因 计组实验中的涉及到此问题,当时上网查阅了许多博客和资料都没能理解这两者的计算过程,因此想写一篇博客为后来者提供...

    0. 问题描述

    本文包括4位二进制乘法(4位乘4位)和8位二进制除法(8位除4位)的详细计算过程。

    1.创作原因

    计组实验中的涉及到此问题,当时上网查阅了许多博客和资料都没能理解这两者的计算过程,并且我发现许多资料上的计算过程显得非常繁琐、晦涩,明明两三句话就可以讲明白的东西偏要说的不明不白,细节的地方忽略,计算过程示例也很少且不清楚,导致我遇到了很大困难。后来历经磨难终于理解了这两个计算过程,当时就决心要写一篇博客把这个用最简单但却最详细的话讲清楚,为后来者提供便利,少走一些弯路,多节约一些时间。
    下面我们直接开始吧~

    2.二进制乘法

    被乘数设为5:101B
    乘数设为7:111B

    开始计算之前设置一个变量N保存乘法的最终结果,初始化为0。
    则有详细的计算过程如下:

    1. 判断乘数111B的最后一位为1,则N加上被乘数,N更新为0+5=5
    2. 乘数右移一位更新为11B,被乘数左移一位更新为10
    3. 判断乘数11B最低位为1,则N加上被乘数,N更新为10+5=15
    4. 乘数右移一位更新为1B,被乘数左移一位更新为20
    5. 此时乘数1B最低位为1,则N加上被乘数,N更新为20+15=35
    6. 乘数右移一位更新为0,被乘数左移一位更新为40
    7. 此时检测乘数为0,循环结束,N的最终结果为35,即为乘法的结果

    下面来总结一下整个计算过程的要点:

    • 继续循环还是结束循环取决于什么时候乘数变为0
    • 每一次循环中如果乘数最后一位为1则N加上被乘数;为0则不加上被乘数

    下面再来看一下它的思想是什么:
    我们知道 8 ∗ 8 = 16 ∗ 4 = 32 ∗ 2 = 64 ∗ 1 = 64 8*8=16*4=32*2=64*1=64 88=164=322=641=64, 这个乘法的特点就给了我们计算二进制乘法的思路,二进制中左移是乘2,右移是除2,如果被乘数左移乘数右移那么他们的乘积是不变的,即: 100 B ∗ 10 B = 1000 B ∗ 1 B = 1000 B = 8 100B*10B=1000B*1B=1000B=8 100B10B=1000B1B=1000B=8。但是如果乘数的末位为1的话不能简单地进行左移右移,设想如果不加处理乘数直接右移那么结果就会丢失掉一个被乘数的大小,这也就是为什么如果判断末位为1结果就要加上一个被乘数的原因。

    8位乘8位的结果需要16位保存,其计算过程也与上方相同,只是需要涉及的寄存器更多,更加复杂一些。

    3.二进制除法

    被除数24:11000B
    除数5:101B

    开始计算前我们设置一个N表示商,其值初始化位0。
    则有详细的计算过程如下:

    1. 将除数的最高有效位左移至与被除数的最高有效位对齐,这里将除数101B左移两位即可,除数更新为10100B
    2. 用被除数11000B减除数10100B,发现减得过来,因为减得过来,所以商+1,商更新为N=1。减法的结果为100B,所以被除数更新为100B
    3. 用被除数100B减除数10100B,发现减不过来,因为减不过来,所以除数右移一位,更新为1010B;因为除数右移一位,所以商左移一位更新为N=1*2=2 (注:左移就是与2做乘法)
    4. 用被除数100B减除数1010B,发现减不过来,所以除数右移一位,更新为101B;因为除数右移一位,所以商左移一位更新为N=2*2=4
    5. 发现现在除数的大小又变回了最开始的大小101B,则循环结束。所以现在的N=4就是除法结果,现在的被除数100B就是除法的余数
    6. 结束,结果正确

    下面来总结一下整个计算过程的要点:

    • 有许多资料可能会设置一个计数器,但我采用的的是另外的方法,和计数器其实是差不多的。除法进行到最终,除数一定要与最开始的除数相等,如果不相等则需要除数一直右移直至相等为止,相应的商也要左移同样的位数(这其实就是整除的情况)
    • 循环继续还是停止取决于除数是否与最开始的除数相等
    • 循环中,用被除数减除数,如果减得过来就用减法结果更新被除数并商+1;如果减不过来除数就右移一位,商左移一位
    • 减不减得过来其实就看在做减法的过程中是否产生借位就可以了,在汇编语言中可以体现为标志位CF是否为1

    下面我再举一个整除的例子:
    被除数8:1000B
    除数2:10B

    计算开始:

    1. 除数10B左移两位,更新为1000B
    2. 被除数1000B减除数1000B,减得过来所以商+1,商更新为N=1;减法的结果为0所以被除数更新为0
    3. 被除数0减除数1000B,减不过来所以除数右移一位更新为100B,因此商左移一位更新为N=1*2=2
    4. 被除数0减除数100B,减不过来所以除数右移一位更新为10B,因此商左移一位更新为N=2*2=4
    5. 此时除数已经等于原来的除数所以循环结束,除法的商为4,余数等于此刻的被除数0
    6. 除法结束,结果正确

    你是否对上面有一点说法有所疑惑?我在上面说到了如果什么时候除数与最开始的除数相等则结束循环,那么肯定有人会想,如果刚开始除数就不需要左移(这个时候被除数与除数位数相同),这时候是不是只进行一次循环就停止呢?

    举一个除数不需要左移的例子:
    被除数14:1110B
    除数9:1001B

    还是设除法的商为N,初始化为0。
    则有详细的计算过程如下:

    1. 除数1001B与被除数1110B最高有效位对齐,所以无需左移
    2. 被除数1110B减1001B,发现减得过来,则商+1,N更新为N=0+1=1;减法结果为101B,则被除数更新为101B
    3. 被除数101B减除数1001B,发现减不过来,再发现此时除数与最开始的除数相等,所以除数无需右移,计算直接结束
    4. N=1为最终的商,被除数为101B则为除法的余数

    那么上面的计算过程需要注意这些地方:

    • 注意你需要在计算的什么地方判断除数是否等于最开始的除数,也就是说你需要明白你应该把判断除数这一过程放在步骤的哪一步才能让计算正确的结束,这需要思考
    • 这个计算过程能够正确计算被除数小于除数的情况

    它的计算思想就不细说了,在上述计算过程中都有所体现。
    我用汇编语言分别实现了这两个计算过程,如下:

    4.汇编实现

    4.1 4乘4乘法

        mov R0, #9
        mov R1, #7
        mov R2, #0
    
        mov A, R0
        and A, R0
        jz OVER;check zero
    LOOP:
        mov A, R1
        and A, R1
        jz OVER;check zero
        and A, #1
        jz TAG2
        mov A, R2
        add A, R0
        mov R2, A
    TAG2:
        mov A, R1
        shr R1
        mov A, R0
        shl R0
        jmp LOOP
    OVER:
        halt 
    

    4.1 8除4除法

            mov R1, #3;除数
            mov R2, #0;商
            mov A, R1
            mov 90, A;把除数存储起来
            
            ;计算计数器的值
    JUDGE_CNT:
            mov A, R1
            and A, #80h
            jz RM;如果是0就左移
            jmp JUDGE_CNT_END
    RM:
            shl R1
            jmp JUDGE_CNT
    JUDGE_CNT_END:
            mov A, R0
            sub A, R1
            jc ADD_BACK_MOVE;不够减加回去,除数右移
            ;够减商加一,被除数更新
            mov R0, A
            add R2, #1       
            
    ADD_BACK_MOVE:;不够减的情况
            ;除数右移一位
            mov A, R1
            sub A, 90
            jz OVER;减到原除数大小结束
            shr R1
            shl R2
            jmp JUDGE_CNT_END
    OVER:
            jmp OVER
    

    4.3 说明

    这两个汇编程序不是8086那套东西所以可能有不一样的地方,不用在意,大家只需要关注其中的计算过程即可。

    5.ending

    若有疑问可以在评论区提出一起来探讨,对你有帮助的话别忘了点赞喔~

    展开全文
  • 2.5我们着重介绍了二进制整数的加、减运算,本次我们继续介绍乘、除运算。本章是迄今为止最难的一章,希望各位猿友有所收获,也别忘了“点个推荐哦”。引言运算一直是程序运行当中一个重要的环节,而在二进制运算...
  • 有符号的二进制乘法

    千次阅读 2020-04-13 22:16:17
    有符号二进制数的乘法 我的失误(差点误以为自己乘法有问题,自己和别人算的不一样) x=101=-3 和y=011=3相乘 结果为110111=-9 我刚开始以为是简单的把连个二进制码相乘得到的结果就是其答案(001111),而事实确...
  • 计算机基础知识之二进制乘法

    千次阅读 2020-02-12 14:25:55
    那么二进制乘法是如何计算的呢? 我们都知道十进制的乘法,比如20.0*10=200.也就是小数点向右移动一位,如果是除以10的话,小数点就想左移动一位就可以了。 如果是二进制的话,也是同样的道理。只不过改成了2的幂次...
  • 二进制乘法计算总结

    千次阅读 2020-08-27 12:55:53
    结论: 1.计算前符号位扩展 2.有符号负数计算机计算过程直接计算,人工语言转化为原码计算。 首先需要确定的是在计算机中所有的数都是以补码的方式存在。 所以在无符号数计算,因为无符号数的补码就是本身,可以直接...
  • 二进制的大整数乘法

    2011-11-22 22:30:47
    设计二进制的大整数乘法,要求利用分治的思想编写递归算法,并可以实现多位数(位数n是2的整数幂)的乘法(利用数组实现),给出程序的正确运行结果。
  • 二进制原码一位乘法运算

    千次阅读 2020-03-17 17:41:58
    原码一位乘法运算 今天自己遇到的和大家分享分享(语句比较啰嗦,希望耐心看完,对你会有所影响,哈哈哈) 主要思想:符号位单独参加运算,数据位取绝对值参加运算。 运算法则: 设: [X]原=X0.X1X2…Xn [Y]原=Y0. ...
  • **规则:**两个r为二进制数相乘时,乘积为2r位;乘数的第i位(i为1、2…)为0时,第i位的部分积为0;第i位为1时,第i位的部分积时被乘数。 (2)原始乘法算法过程 (3)改进算法过程 ASM图规则: a.在ASM图的起始点...
  • 二进制补码乘法除法 1)二进制乘法 (1) Binary Multiplication) Binary numbers can be multiplied using two methods, 二进制数可以使用两种方法相乘, Paper method: Paper method is similar to multiplication ...
  • 为什么二进制乘除法可以转换成移位运算呢? 如: a=5; a=a*9; 可以转换成a=(a a=a*7 可以转换成a=(a a=a/12; 可以转换成 a=(a>>4)-(a 因为乘除和减法都能转换成移位和加法运算,所以cpu中只需要一个...
  • 有符号二进制数的乘法

    千次阅读 2021-05-02 09:17:29
    x=101=-3 和y=011=3相乘 结果为110111=-9 把前面的符号位补出来相乘以后,才是这道题的答案(在截取6位数)。(111 101)*(000011)=110111=-9 ———————————————— 版权声明:本文为CSDN博主「武当...
  • 基本的二进制算术运算算法,包括: 1. 总结2.减法3. 乘法4. 除法和取模5. 二进制-十进制转换 这些算法可用于计算非常大的整数,这是标准 Matlab 的变量类型无法处理的。 尽管可能不是最有效的,但这些对于教育目的和...
  •   在嵌入式环境中虽然有乘法运算器,而且芯片运算速度越来越快,但位运算还是最快速的,为了提高计算效率,可以将乘法运算使用位运算替换。 原理   乘法可以用按位运算的基本原理,分两步 因式分解: A * (B + ...
  • 二进制乘法的booth算法

    千次阅读 2020-04-08 15:26:22
    二进制乘法的 booth 算法 wiki 的解释 算法原理 考虑一个由若干个 0 包围着若干个 1 的正的二进制乘数,比如 00111110,积可以表达为: M× ′′0  0  1  1  1  1  1  0 ′′=M×(25+24+23+22+21...
  • 进制乘法 位移运算 的表示

    千次阅读 2018-08-21 09:39:52
    预备知识: 4(十进制) * 2 = 100(二进制) * 2 = 100(二进制) << 1(左移一位) = 1000(二进制) = 8 (十进制) 可以自行演示4(十进制)* 4 ; 得到的结论为 左移 1 位,即乘以2,左移两...
  • 二进制补码计算——有符号数的乘法

    千次阅读 多人点赞 2020-11-25 11:15:12
    位数问题 a_width位的a,乘以B_width位的b,结果的位数是A_width + B_width。 定点小数问题 小数位数等于a的小数位数,加上b的小数位数之和。 补码相乘问题 补码 * 补码 = 补码 无符号数 * 无符号数 ...
  • 二进制运算电路 二进制运算电路 二进制运算电路 数字逻辑 数字逻辑
  • 二进制数的运算可分为二进制整数运算二进制小数运算两种类型,但运算法则完全相同.由于大部分计算机中数的表示方法均采用定点整数表示法,故这里仅介绍二进制整数运算二进制小数运算与它相同.在计算机中,经常...
  • 3. 允许使用加减法(+/-),模运算(%),各类位运算,逻辑运算符,循环语句, 数组,基本数据类型等。 输入格式: 输入在一行中给出2个绝对值不超过九位数(十进制)的整数A和B, 允许输入负数,允许正数前加“+”...
  • 二进制计算

    千次阅读 2021-07-21 05:31:49
    虽然很早就接触了二进制,却一直没有正视这个问题,阅读《计算机科学导论》的时候,基本上是跳过了这一部分,总是以“这么基础的东西,反正工作中基本用不上”的理由给搪塞过去。最近正在阅读《编码》和《程序员的...
  • 修改的王金明Verilog HDL 8*8位2进制乘法。。自己的想法,从最高位开始运算,王老师从最低位开始运算
  • 运算规则 . 加法 注:我们在算负数的补码的时候,是符号位不变,剩下的取反加一 但是在算 [-x] 的补码的时候,所有位都要取反 例: 三. 乘法 注:部分积从0.0000开始,然后从双下划线开始乘A,之后与...
  • ## 线上实验五:2个2位二进制乘法

    千次阅读 多人点赞 2020-08-05 19:22:48
    线上实验五:2个2位二进制乘法器 一、实验目的 设计一个乘法器, 实现两个四位二进制数的乘法。 两个二进制数分别是被乘数 AB和乘数CD。被乘数和乘数这两个二进制数分别由高低电平给出。 乘法运算的结果即乘积由一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,349
精华内容 20,539
热门标签
关键字:

二进制怎么乘法运算