精华内容
下载资源
问答
  • 这一讲重点讲清楚2个知识点1、弄清移位运算和乘除运算的关系十进制的运算,我们都很熟悉了,那么二进制的运算机制是怎样的呢?其实,四则运算同样也可以使用在二进制中,要注意每逢2进一位即可。下面我们来学习...
    这一讲重点讲清楚2个知识点1、弄清移位运算和乘除运算的关系 十进制的运算,我们都很熟悉了,那么二进制的运算机制是怎样的呢? 其实,四则运算同样也可以使用在二进制中,要注意每逢2进一位即可。 下面我们来学习二进制特有的运算(计算机特有的运算)什么是移位运算?移位运算指的是:将二进制数值的各位数进行左右移位(shift=移位)的运算。①左移:向高位方向②右移:向低位方向案例0e0e6c89cef3f75c217e70c639214ae6.png 图示意思:变量a保存十进制39,将左移两位后的结果保存在变量b中。对于计算机来说,无论移动的是十进制或者十六进制等,在底层都是转换成二进制来操作的。上面的案例转换成二进制后移位(左移2位)操作如下 ddb4cf4eee9736218bf7cc1d2bf9bebd.png对上图的说明:无论左移还是右移,溢出的最高位或者最低位直接舍弃。左移空出的最低位用0补,右移空出的最高位后面讲解。规律:十进制左移后会变成原来的10倍、100倍、1000倍。。。同样的,对于二进制来说,左移后变成原来的2倍、4倍、8倍。。。。反之,右移后变成原来的1/2  1/4   1/8等,这从侧面也能反映出移位运算能代替除法运算了。 2、补数补数概念是为了解决计算机中负数的表示方式那么什么是补数?二进制表示负数的原则:最高位作为符号位来表示最高位为0,表示正数最高位为1,表示负数说到这儿可能有些人想,按照上面的原则,-1就表示成10000001,正确答案是11111111计算机在做减法运算时,内部转换成加法运算的,为此,表示负数时要使用到二进制中的补数,补数就是用正数来表示负数。计算机中,一个正数-一个负数=一个正数+这个负数的补数 3、如何获取补数?获取补数的方法:二进制的各数位的数值全部取反,然后将取反后的数加1.如用8位二进制表示-1时,只需求得1的补数即可。1-->0000000100000001取反1111111011111110+1=11111111如下图02815a826756f293d0ae9d8d99fd5321.png补数这种思维方式,直观上可能不容易理解,但是逻辑上是很严谨的。案例1-1=1+(-1)=0如果把-1表示成10000001,运算结果如下。(错误) 1ef708b8ca53eda70242d6eacb76cb6d.png如果把-1表示成11111111,运算结果如下。(正确)  c8e8968153689cbbfb5663ae09dfaf56.png补数求解的变换方式就是取反+1为什么使用补数后就能正确的表示负数呢?看下图c8e8968153689cbbfb5663ae09dfaf56.png运算结果为0结论:将二进制数的值取反后加1的结果和原来的值相加,结果为0注意:当运算的结果为负数时,计算结果也是以补数的形式来表示的。案例(3-5)3--000000115--000001015的补码为11111010+1=11111011-2用补数表示2--000000102取反111111012取反后+111111110 7435721c8190f8201313aca8a4faafff.png 4、这一讲我们讲了移位运算和乘除运算的关系和补数,这些知识点对于一个程序员来说,有时候很重要。明白这些底层机制以后,可以用于代码的优化,提高开发速度等方面。对于非专业人员,了解这些知识可能对你暂时没有用。但是,如果我们学习什么东西都要追求当前有用,那你的视野可能有些狭隘。现在很流行的说法是,跨界学习,我所理解的跨界学习是,不要局限于当下,有时候可以学点无用之学,说不定哪天可以在你的领域内解决大问题呢。 下一讲:逻辑右移和逻辑算术右移的区别
    展开全文
  • 二进制加减乘除运算

    千次阅读 2019-03-09 11:40:48
    加减 二进制 十进制 0000 =0 0001 =1 ...二进制运算算术运算二进制的加法: 0+0=0, 0+1=1 , 1+0=1, 1+1=10(向高位进位); 列如 3+1=0011+0001=0100 5+2=0101+0010=0111 二进制的减...

    加减

    二进制 十进制
    0000 =0
    0001 =1
    0010 =2
    0011 =3
    0100 =4
    0101 =5
    0110 =6
    0111 =7

    二进制的运算算术运算二进制的加法:
    0+0=0,
    0+1=1 ,
    1+0=1,
    1+1=10(向高位进位);

    列如
    3+1=0011+0001=0100
    5+2=0101+0010=0111

    二进制的减法:
    0-0=0,
    0-1=1(向高位借位)
    1-0=1,
    1-1=0 (模二加运算或异或运算) ;
    例如
    3-1=0011-0001=0010
    5-2=0101-0010=0011

    乘除

    二进制乘除运算
    左移 -----除以2
    右移 -----乘以2
    例如:
    0110=6
    左移----0011=3
    右移------1100=12
    0010=2
    左移----0001=1
    右移----0100=4

    最后:二进制最大数,最小数

    正值的最大表示为0111 1111,= 127]
    负值的最小表示为1000 0000,即-128。

    展开全文
  • 二进制整数的乘除运算 前言 运算一直视程序执行其中一个重要的环节,而在二进制的运算过程其中,加法运算有时重中之重,他基本上奠定了二进制运算的基础.因此不管是减法还是乘法,都能够由加法运算来取代,只有除法不能...

    二进制整数的乘除运算

    前言

    运算一直视程序执行其中一个重要的环节,而在二进制的运算过程其中,加法运算有时重中之重,他基本上奠定了二进制运算的基础.因此不管是减法还是乘法,都能够由加法运算来取代,只有除法不能取代.

     

    了解了计算机运算的规律,能够有助于我们理解非常多程序代码上无法理解的内容能够.比方上一张提出的溢出问题,在了解了加法运算的原理之后,相信大家都能够轻松您的知道为何有些运算会得到意想不到的结果.

     

    这里还须要提到一点,不同的处理器所採取的运算方式可能有细微的区别,因此也不能一概而论.因此我们大多数时候会尽量讨论运算的而抽象数据特性,抽象的东西大部分时候总是可靠的,这样的特性为跨平台提供了基础,只是也并不是是总是如此,毕竟本屌仅仅听说过浮点数运算标准,没听过整数运算标准.可能有,可是本屌没听过.

     

    正因如此,我们了解一下运算的抽象性,会有助于我们理解程序代码级无法理解的东西.

     

     

    无符号乘法

    无符号的乘法与加法类似,他的运算方式是比較简单的,仅仅是也可能产生溢出.对于两个w位的无符号来说,他们的乘积范围在0(2w次方-1)的平方之间,因此可能须要2w位的二进制才干表示.因此因为位数的限制,如果两个w位的无符号数的真实乘积为pro,依据截断的规则,则实际得到的乘积为pro mod 2w次方

     

     

     

    补码乘法

    与加法运算类似,补码乘法也是家里在无符号的基础之上的,因此我们能够非常easy得到,对于两个w位的补码来说,如果他们的真实乘积为pro,则实际得到的乘积为U2Tw(pro mod 2w次方)

     

    上面的式子我们有一个如果,就是如果对于w位的两个补码数来说,他们的乘积的低w位于无符号数乘积的低w位是一样的.这意味着计算机能够使用一个指令运行无符号和补码的乘法运算.

     

    证明过程略过了,就是利用无符号编码和补码编码的关系.

     

     

     

    乘法运算的优化

    依据我们小学学的乘法运算,我们知道,如果两个w位的二进制数相乘,则须要进行w次与运算,然后进行w-1次加法运算才干得到结果.从此不难看出,乘法运算的时间周期是非常长的.因此计算机界的大神们出山了,他们相处了一个能够优化乘法运算的方法,就是使用移位运算和加法来取代乘法.

     

    上述有花的前提是对于一个w位的二进制数来说,它与2

    k次方的乘积,等同于这个二进制数左移k,在低位补k0.证明过程有兴趣的同学自己看看,我反正没兴趣.事实上还是主要应用了无符号编码的公式.

     

     

    有了上面的基础,我们就能够使用移位和加法对乘法优化了.对于随意一个整数y,他总是能使用二进制序列表示(如果不超过二进制的表示范围),因此我们将xy乘积的二进制序列表示为例如以下形式:

     x * y = x * (yw-12w-1 + ... + y020) =  (x << w-1) * yw-1 +....+ (x << 0 ) * y0

    举个样例,对于x*17,,我们能够计算x*16+x=(x<<4)+x,这样算下来的话,我们仅仅需一次移位一次加法就能够搞定了.而对于x*14来说,则能够计算x*8+x*4+x*2=(x<<3)+(x<<2)+(x<<1),更快的方式我们能够直接这样做:x*16-x*2=(x<<4)-(x<<1).

    这里最后须要提一下的是,加法,减法和移位的速度并不会总快于乘法运算,因此是否要进行上面的优化就取决于二者的速度了.

     

     

     

    无符号除法

    除法和乘法不同,出发不满足假发的分配率,也就是设y=m+n,x/y!=x/m+x/n,更不幸的是,它有时候会比乘法运算更慢,可是我们仅仅探讨仅仅能针对除数可表示为2k次方的除法运算进行优化,转换为算术右移或者逻辑右移k位的运算(无符号数为逻辑右移,为正数时,逻辑右移与算术右移效果一样).

    由于是除法,因此我们会涉及到舍入的问题.

     

    先看案例:

                int a = 17;

                int b = 8;

                int c = a / b;

                Console.WriteLine("a:" + Convert.ToString(a,2));

                Console.WriteLine("b:" + Convert.ToString(b, 2));

                Console.WriteLine("c:" + Convert.ToString(c, 2));

                Console.WriteLine("a >> 3:" + Convert.ToString(a>>3, 2));

    还是C#代码,这段程序的结果能够看出a/b的结果就是a右移3位的结果,就是结果等于a>>3

     

     

    无符号数除以2k次方等价于右移k.证明过程不说了,记住结论.

     

    不知道你发现了没有,乘法是左移,乘法是右移.

     

     

     

    补码除法

    哟与刚才我们的程序使用的都是正数,因此尽管C#中没有无符号数,只是我们能够模拟出无符号数的结果.也能够觉得,补码除法在被除数为正数的情况下,与无符号除法是一样的效果(暂别考虑除数为负数的情况了,由于被除数与除数的符号位能够相互抵消,下面也一样),只是当被除数为负数时就不同了.这里在介绍补码除法之前,我们先来看一下,a为负数时的结果,也就是此时会採用补码编码.

    案例:

                int a = -17;

                int b = 8;

                int c = a / b;

                Console.WriteLine("a:" + Convert.ToString(a,2));

                Console.WriteLine("b:" + Convert.ToString(b, 2));

                Console.WriteLine("c:" + Convert.ToString(c, 2));

                Console.WriteLine("a >> 3:" + Convert.ToString(a>>3, 2));

                Console.WriteLine("c:"+c);

                Console.WriteLine("a >> 3:" + Convert.ToString(a>>3));

    结果有点出人意料:

    a:11111111111111111111111111101111

    b:1000

    c:11111111111111111111111111111110

    a >> 3:11111111111111111111111111111101

    c:-2

    a >> 3:-3

     

     

    这次为了便于观看,我们将ca>>3的整数值打印了出来,发现移位运算的结果是-3,a/b的结果为-2.我们能够看出a/b的结果是我们所期望的,能够移位运算的结果在舍入的出现了问题.为啥?

    事实上这个问题的解决办法非常easy,补码编码与无符号的编码类似,对于位表示同样.只是此时因为是负数,所以採用了向下舍入.

     

    此时能够记住一个结论:当有舍入发生的时候,降一个负数右移k位不等价与把它除以2k次方.

     

     

    除法的补数

     

    既然在舍入时,一个负数右移k位不等价于把它们除以2k次方.那么为了使用这样的优化,计算机界的大神们有出马了,于是他们又想出了一个办法,”偏置”这个值.

     

    在上面的基础上,”偏置”的含义是啥?

    看个案例:

                int a = -17;

                int b = 8;

                int c = a / b;

                Console.WriteLine("a:" + Convert.ToString(a,2));

                Console.WriteLine("b:" + Convert.ToString(b, 2));

                Console.WriteLine("c:" + Convert.ToString(c, 2));

                Console.WriteLine("a >> 3:" + Convert.ToString((a+b-1)>>3, 2));

                Console.WriteLine("c:"+c);

                Console.WriteLine("a >> 3:" + Convert.ToString((a + b - 1) >> 3));

     

    此处我们将a”偏置”,也就是加上b-1的偏移量,结果例如以下:

    a:11111111111111111111111111101111

    b:1000

    c:11111111111111111111111111111110

    a >> 3:11111111111111111111111111111110

    c:-2

    a >> 3:-2

    可以看出,在偏置之后,在负结果舍入时,移位运算的结果将会是我们期望得到的,这样我们便可以使用这一技巧进行优化了,什么歌意思呢?我们在做了将a+b-1这个处理之后,结果会在原来的基础上加1.这就是偏置的含义所在,它会将舍入偏置到向上舍入.

     

    小结

    二进制整数的运算较重要吗?不是,是非常重要,也较难,多花点力气没错.

    转载于:https://www.cnblogs.com/lxjshuju/p/7001665.html

    展开全文
  • 二进制数的运算前,我们先看看二进制数的值与十进制数的值是如何相互转换的, 十进制转换成二进制 将十进制数除以2,得到的商再除以2,依次类推直到商为1时为止,然后在旁边标出各步的余数,最后从下往上倒着写...

    二进制数与十进制数的转换

    聊二进制数的运算前,我们先看看二进制数的值与十进制数的值是如何相互转换的,
    十进制转换成二进制
    将十进制数除以2,得到的商再除以2,依次类推直到商为1时为止,然后在旁边标出各步的余数,最后从下往上倒着写出来,高位补零就可以成功转换成二进制。
    例如下图49的二进制数就是110001
    在这里插入图片描述
    二进制转换成十进制
    只需将二进制数的各数位的值和位权相乘,然后将相乘的结果相加即可,有木有感觉特别方便。
    在这里插入图片描述
    二进制数的符号位
    二进制数中表示负数值时,一般会把最高位作为符号位来使用,最高位为0代表正数,最高位为1代表负数。
    这时了解二进制的人可能就会疑问,既然最高位1代表负数,1是00000001,那-1应该是10000001,为什么是11111111呢?要解释这个我们要先引入“补数”的概念,因为计算机在做加减运算时其实内部只会做加法运算,所以为了表示负数,就用正数来表示负数,这就是负数的概念。得到补数的方法很简单,进行取反操作,将二进制数的各位数的数值由1变为0,0变为1,再将结果加上1就可以了。

    00000001——————1(十进制)
    先进行取反操作,之后再加上1
    11111110
    变成
    11111111——————-1(十进制)

    不信的同学还可以验证以下,就会发现8位二进制的-1+1刚好等于100000000,而计算机会直接忽略掉最高位溢出的那个数字,所以刚好是00000000了。

    二进制数的乘除运算

    二进制数的乘除运算有两种方法,要么先转化位十进制数进行运算之后再转换为二进制(想来有点麻烦),要么头铁直接用二进制数进行乘除运算。

    在这里插入图片描述
    二进制数111乘以1011,乘数1011的每一位分别与乘数相乘,得到111、1110、00000、111000,将其加起来,得到1001101,这便是二进制乘法最直接的解求过程;也可以将111转化为十进制数7,1011转化为十进制数11,显版然7乘以11等于77,再将十进制数77化为二进制数1001101,显然1x26+1x23+1x22+1x20=64+8+4+1=77,所求结果完全正确。——百度

    二进制数的移位运算

    移位运算可是二进制的门面招牌
    在这里插入图片描述

    移位运算指的是将二进制数值的各数位进行左右移位(shift=移位)的运算。移位有左移(向高位方向)和右移(向低位方向)两种。在一次运算中,可以进行多个数位的移位操作。在程序代码中<<这个运算符表示左移,>>这个运算符表示右移,

    int a=1;
    int b;
    b=a<<3;//b现在为8

    运算符左侧是被移位的值,右侧表示要移位的位数。看到这有些同学就会想到,这移了几位不多了几个空白处么,计算机这千年老怪早想好了,如果是左移运算的话,它就会在空出来的低位补0。如果是右移运算的话,就稍微有点特殊,因为存在两种情况,既可以填1也可以填0,这就是逻辑右移和算数右移的区别。

    当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0.类似于霓虹灯往右滚动的效果。这就称为逻辑右移。
    将二进制数作为带符号的数值进行运算时,移位后要在最高位填充移位前符号位的值(0或1)。这就称为算数右移。例如负数就在最高位补1,正数就在最高位补0。
    在这里插入图片描述

    展开全文
  • 二进制算术运算你好,在数字计算机和其它数字系统中,都会涉及到二进制算术运算。这一节主要介绍二进制加法、二进制减法、二进制乘法、二进制除法以及二进制反码、补码等知识。一 二进制加减乘除前面二进制的加减...
  • 二进制算术运算你好,在数字计算机和其它数字系统中,都会涉及到二进制算术运算。这一节主要介绍二进制加法、二进制减法、二进制乘法、二进制除法以及二进制反码、补码等知识。一 二进制加减乘除前面二进制的加减...
  • python中的二进制逻辑运算逻辑运算 逻辑运算 python中含有和c++一样的&,|,~,^等逻辑运算,可以模拟加减乘除等基础运算。 由于在python中定义变量类型没有固定的位长,我们在使用bin()方法打印变量的二进制表示时...
  • 运算实现整数加法方法x^y //执行加法,不考虑进位。(x&amp;y)&lt;&lt;1 //进位操作解释在这里我们先用1位数的加法来进行,在不考虑进位的基础上,如下12341 + 1 = 01 + 0 = 10 + 1 = 10 + 0 = 0很明显...
  • 这是我们老师在上课时候所讲到的大部分内容,拿过来供大家分享分享,多多支持
  • // 二进制从右向左计算 $a = 1; // 1 0001 $b = 1 + 2; // 3 0011 dump($a & $b); // 0001 dump($a | $b); // 0011 dump($a ^ $b); // 0010 dump(~$a); // -2 dump(decbin($a)); // "1" dump(decbin(~$a)); /...
  • 移位运算是将数值向左向右移动,对于十进制来说就是实现放大十倍和缩小十倍的效果,而对于二进制而言就是放大两倍和缩小两倍的效果。整数的乘除法一个自己曾经忽视的东西,那就是C/C++中的移位操作容易出错的...
  • 在计算机组成原理的第二章中讲到了二进制运算,这是老师的东西,拿来大家分享一下
  • var getCorrectResult = function(type, num1, num2, result) { var temp_result = 0; switch (type) { case "add": temp_result = num1 + num2; break; case "su...
  • 最近对电脑中,数据的运算过程感兴趣了,前面写了两篇相关的博文,一篇是整数的存储原理https://editor.csdn.net/md/?articleId=103569332 一篇是负数的位移运算https://editor.csdn.net/md/?articleId=103638244 有...
  • 十进制和二进制之间的转换2.2.二进制转八进制/十六进制2.3.八进制/十六进制转二进制3. 二进制数的计算3.1.加减乘除3.2.反码和补码3.2.1反码,补码的求法3.2.2.关于符号的问题3.2.3.补码的意义 2. 不同数制之间的...
  • 51单片机实现三位十进制数加减乘除运算 一.题目 51单片机IO接口作业 请将附件给出的Proteus图用51单片机完成一个计算器功能。 1、显示采用动态分时8位共阳数码管输出。 2、采用4*4矩阵键盘输入,键盘上已经标识对应...
  • 二进制运算与转换

    2019-10-27 14:35:32
    一开始并不是十分的理解什么是二进制,写了从1到512的全部二进制表达,才有了一些理解。 一 、什么是二进制 二进制是逢2进位的进位制,0、1是基本算符。现代的电子计算机技术全部采用的...二、二进制的加减乘除 ...
  • 二进制运算技巧

    千次阅读 2015-10-21 14:08:40
    假设都在x86或x86_64架构CPU上进行运算二进制基本运算包括,加减乘除、与、或、异或、同或、移位等 假设n 为 32 位整形数,取正整数n除以8的余数 : n & 0x07 假设n 为 32 位整形数,取正整数n除以16的余数 :...
  • c语言计算器代码(有注释),可实现、十、十六等多进制的加减乘除运算,可实现界面刷新、返回、退出等多项功能
  • 二进制数及其运算

    2020-07-28 08:14:13
    如何使用二进制进行加减乘除二进制数如何表示负数呢?本文将为你揭晓。 为什么用二进制表示 计算机内部是由IC电子元件组成的,其中CPU和内存也是IC电子元件的一种,CPU和内存使用IC电子元件作为基本单元。IC电子...
  • 文章目录十进制转二进制机器数与真值原码、反码、补码顺便说一说BCD码数的定点表示与浮点表示IEEE 754标准定点运算加法与减法运算溢出浮点运算加法与减法运算 十进制转二进制 正整数转二进制,这个简单,除2取余,倒...
  • 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。class Solution { public: int Add(int num1, int num2) { while(num2!=0){ int tmp=num1^num2; num2=(num1&num2)<<1;
  • 二进制 加减乘除

    2019-07-10 21:47:41
    写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 解题思路 第一步:两个数按位取亦或。获得的值为不考虑进位时的和。 第步:两个数按位取与。获得的值为(当两个数某一位同为1时)...
  • 二进制乘除法运算原理

    千次阅读 2020-04-01 16:42:32
    二进制乘除法原理 ...假设不能使用乘除运算求a×b的结果,当a=b=123时,最直接的方法是通过88个88相加。但是,我们不难发现这样的规律: 123 × 123 = (100+20+3)×123 = (100×123) + (20 × 123) + (3 ...
  • 首先介绍计算机的二进制二进制常用的有原码,反码和补码,他们都是由最左边的一个符号位和右边的数值位构成。在计算机中为了更低成本的计算,数据都是用补码来存储和运算的。 原码 最高位表示符号位(0代表正数,...
  • 思路:若直接算二进制之间的运算,很难,所以可先将输入的二进制转换为十进制,经过十进制的加减乘除后,得到十进制结果,最后将此结果转换为二进制输出。所以需构造两个函数:dou_ten()二进制转十进制函数,ten_dou...
  • 思路:二进制做加法时,1和1加或0和0加都是0,1和0加或0和1加都是1,相当于异或运算,但还要解决进位问题,1和1加时下一位产生进位,相当于各位相与向左移,之后再将进位和异或和再次异或直到没有进位 public class ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,097
精华内容 438
关键字:

二进制乘除运算