精华内容
下载资源
问答
  • 算术运算 二进制数加法采用逢二进一、减法采用借一作二。 十六进制数加法采用逢十六进一、减法采用借一作十六。 1位八进制可以写成3位二进制,因为3位二进制可以表示十进制范围0~7,也就是1位八进制的表示范围。 1位...

    算术运算
    二进制数加法采用逢二进一、减法采用借一作二。
    十六进制数加法采用逢十六进一、减法采用借一作十六。
    1位八进制可以写成3位二进制,因为3位二进制可以表示十进制范围0~7,也就是1位八进制的表示范围。
    1位十六进制可以写成4位二进制,因为4位二进制可以表示十进制范围0~15,也就是1位十六进制的表示范围。
    后缀B表示二进制,H表示十六进制,D表示十进制。
    例如:
    1011011B + 10011B = 1101110B
    1011 B * 10011B = 11010001B
    65H + 7AH = 0DFH
    65H * 7AH = 3022H
    110011.0101B + 22.4H = (110011.0101B + 100010.01B = 1010101.1001B =) 85.5625D

    逻辑运算
    二进制数的逻辑运算是位对位的运算,即本位运算结果不会对其他位产生任何影响,这一点与算术运算是截然不同的。
    二进制数的逻辑运算有四种:与AND、或OR、异或XOR、非NOT。
    在这里插入图片描述
    例如:
    10010111B AND 00111000B = 00010000B
    10010111B OR   00111000B = 10111111B
    10010111B XOR 00111000B = 10101111B

    另外,利用逻辑运算可以完成特定操作。
    AND运算可以对指定位进行清零:
    对x的第0、3位清零操作:x AND 11110110B
    OR运算可以对指定位进行置一:
    对x的第1、2位置1操作:x OR 00000110B
    XOR运算可以对指定位进行取反:
    对x的地3、7位取反操作:x XOR 10001000B

    展开全文
  • 二进制算术1、逻辑运算1.1 加法运算规则1.2 减法运算规则1.3 乘法运算规则1.4 除法运算规则2、逻辑运算 ...二进制运算包括算术运算逻辑运算。 1、逻辑运算 1.1 加法运算规则 规则:逢二进一 例子: 1.2 减


    \quad \quad二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.二进制数的运算包括算术运算、逻辑运算。

    1、算术运算

    1.1 加法运算规则

    规则:逢二进一
    例子
    在这里插入图片描述

    1.2 减法运算规则

    规则:借一当二
    例子
    在这里插入图片描述

    1.3 乘法运算规则

    规则:乘什么就是什么
    例子
    在这里插入图片描述

    1.4 除法运算规则

    规则:二进制的除法运算和十进制的类似,不存在进位、借位。
    例子
    在这里插入图片描述

    1.5 负数

    二进制下负数的表示: 正数的反码加1
    5: 00000000 00000000 00000000 00000101
    5的反码: 11111111 11111111 11111111 11111010
    -5: 11111111 11111111 11111111 11111011

    2、逻辑运算

    之前位运算博文

    展开全文
  • 2、记住前15个数值的二进制与十六进制表现形式有助于完成它们之间转换工作 3、在使用无符号数值时,进位标志有助于判断是否发生溢出 4、使用逻辑运算符“or”,“and”,“xor”分别来实现对比特位设置、...

    1、所有的小数系统都使用了某一个数值为基础的幂值

    2、记住前15个数值的二进制与十六进制表现形式有助于完成它们之间的转换工作

    3、在使用无符号数值时,进位标志有助于判断是否发生溢出

    4、使用逻辑运算符“or”,“and”,和“xor”分别来实现对比特位的设置、测试和反置操作

    5、表示负数有三种方法:符号数值表示法、1的补码表示法和2的补码表示法。前两种表示法都会遇到正负零的问题,而后一种能表示一个负数值

    6、在表示负数值时,2的补码表示法是最常用的表示法,它用于inter处理器之中

    7、在使用2的补码表示法时,如果遇到最左边的比特位的进位值不同于进位到最左边比特位的进位值时,就会有溢出发生

    展开全文
  • 移位运算是将数值向左向右移动,对于十进制来说就是实现放大十倍缩小十倍效果,而对于二进制而言就是放大两倍缩小两倍效果。整数乘除法一个自己曾经忽视东西,那就是C/C++中移位操作容易出错...
    大部分的C编译器,用移位的方法得到代码比调用乘除法子程序生成的代码效率高。

    最近在看Java源码的时候,看到了一些位运算的操作,特意在整理了一下移位运算,不整理不知道,一整理吓一跳,那就随着一起看下去吧!

    移位运算是将数值向左向右移动,对于十进制来说就是实现放大十倍和缩小十倍的效果,而对于二进制而言就是放大两倍和缩小两倍的效果。

    整数的乘除法

    一个自己曾经忽视的东西,那就是C/C++中的移位操作容易出错的情况。

    1、什么样的数据类型可以直接移位

    char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都可以进行移位操作,而double、float、bool、long double则不可以进行移位操作。

    2、有符号数据类型的移位操作

    对于char、short、int、long这些有符号的数据类型:

    对负数进行左移:符号位始终为1,其他位左移
    对正数进行左移:所有位左移,即 <<,可能会变成负数
    对负数进行右移:取绝对值,然后右移,再取相反数
    对正数进行右移:所有位右移,即 >>

    这里很重要,具体为啥是这样,文章之后会解释!

    3、无符号数据类型的移位操作

    对于unsigned char、unsigned short、unsigned int、unsigned long这些无符号数据类型:

    没有特殊要说明的,使用<< 和 >> 操作符就OK了

    算术移位和逻辑移位运算

    逻辑移位
    对于逻辑移位,就是不考虑符号位,移位的结果只是数据所有的位数进行移位。根据移位操作的目的,左移时,低位补0,右移时,高位补0;
    例:
    01010101>>3=00001010
    01101011<<3=01011000
    Q1:此时是不是就有一个问题,不考虑符号位,如果一个负数,逻辑右移,结果就会变成正数,例如
    10000101=-5>>1=01000010=66
    的确是的,因为这是逻辑运算的特点,算术移位运算才会考虑符号位!
    Q2:如果一个有符号数,逻辑左移,导致符号位变化,此时也算逻辑运算的特点吗?
    例如:10000001=-1<<1=00000010=2;
    这里只是溢出,并不算特点,类型溢出在算术移位中也存在!
    另外,C语言中没有无符号移位运算符,怎样才能实现无符号右移呢?负数进行无符号右移,很明显,符号位被0填充,变成正数,这种没有意义,一般都是正数进行无符号位移位,可以强制转换,可以使用除法!
    更严谨的写法:
    1.先进行类型转换((unsigned int)x);
    2.将要移动的数字和0xFFFFFFFF进行与运算,就可以转换为unsigned 类型了(0xFFFFFFFF&x);
    这里假设int型是32位的......

    算术移位
    算术是带有符号的数据,所以我们不能直接移动所有的位数,这可能会使得符号不正确。

    一个很重要的知识:
    关于数的移位,特别需要注意正数,三码相同,所以无论左移还是右移都是补0.而负数的补码就需要注意,左移在右边补0,右移需要在左边补1,有一个很有趣的误区是,认为符号位保持不变,仅仅移动数据位,这是不对的,因为无论数据位还是符号位,都是二进制,在整体大迁移的过程中,符号位也是要跟随潮流的。只不过,为了保证右移后,和原来的符号数一样,因此,负数在右移时左边补1.

    比如8位机器数(补码):1,110 0110,右移一位是:1,111 0011,开始的符号位变成了现在的数据位。
    (1). 原码 原码就是多了一个符号位,所以符号位不变,其余数值位当做逻辑移位来处理即可。
    这里为什么说当逻辑移位运算即可呢?
    因为计算机中存储数据,都是用补码存储的,整数的补码,反码,原码都相同,因此对原码进行算术移位运算,都是对正数进行算术运算,因此用逻辑移位来处理即可!

    (2). 反码 类似原码,符号位不变,其余数值位当做逻辑移位来处理,但是对于负数,补0的时候应该补1,这是因为负数的反码“0”的效果和正数的“1”产生的效果是一样的。

    (3). 补码 观察补码表,不难知道,当左移移出的数据位正数为“0”、负数为“1”时(只有这时候该数值小于等于最大值/2),一定不发生溢出。因为补码是计算机储存的形式,所以在硬件实现的时候为了方便和简化,

    左移:假设不发生溢出,直接将数据最高有效位移入符号位,最低位补0(为什么负数最低位不是补1?如果是反码补1没错,但是补码是反码加了1,所以最低位还是补0)。

    右移:假设不发生溢出,符号位不变,同时用符号位补数值最高位。

    比如,将一个有符号数左移移位,C++编译器的运行会是怎样的呢?
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    int main()
    {
    char a=-65;
    a=a>>1;
    printf("%d",a);
    return 0;
    }
    查看main函数汇编代码:
    main:
    push rbp
    mov rbp,rsp
    sub rsp,0x10
    mov BYTE PTR [rbp-0x1],0xbf
    movsx eax,BYTE PTR [rbp-0x1]
    sar eax,1
    mov BYTE PTR [rbp-0x1],al
    movsx eax,BYTE PTR [rbp-0x1]
    mov esi,eax
    mov edi,0x4007d5
    mov eax,0x0
    call 4005a0 <printf@plt>
    mov eax,0x0
    leave
    ret

    这里稍微补充一下汇编知识点,比如说MOV BYTE PTR[BX] 10H源操作数用的是立即寻址,相当于直接赋值10H,目的操作数用的是寄存器间接寻址,假设BX里的内容(BX)=1000H,(DS)=2000H,那么对应的物理地址为 DS X 10H+BX =21000H,现在这个物理地址对应的单元内容是10H

    mov BYTE PTR [rbp-0x1],0xbf,这句汇编,意思就是将0xbf这个立即数放到(DS) X 10H+rbp-0x1的物理地址中;对应C++中的char a=-65;
    现在来好好看看0xbf,我们知道,-65=11000001,转换为补码,就是除符号位外,其他取反加一,补码为10111111=0xbf !!!
    也就是说,C++在存储数字的时候都采用补码的形式;
    将10111111>>1,结果为11011111,转为原码,也是除符号位外,其他取反加一,为10100001=-33;
    的确,编译器的结果就是-33
    Program returned: 0
    Program stdout
    -33


    如果-65>>2,结果会是多少呢!
    11101111->10010001=-17
    这里为什么会是-17呢!
    10111111>>2,就变为,101111,符号位依然是1,那第七位是补1还是补0呢!
    上面补码中有描述,右移:假设不发生溢出,符号位不变,同时用符号位补数值最高位。
    也就是第七位补1,即移位后变为11101111,原码位10010001=-17;
    如果-65>>3,移位后,10111,符号位为1,第七位补1,那第六位呢!其实,算术右移,左侧均补符号位,即正数补0,负数补1。
    -65>>3=11110111,原码为,10001001=-9

    知道了编译器是通过补码形式进行算术移位运算,考虑了算术右移的情况,那么来考虑算术左移的情况,

    左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,先不考虑这种情况!

    考虑正常的情况,左移的规律如下!

    左移:假设不发生溢出,直接将数据最高有效位移入符号位,最低位补0

    左移的描述中有一个假设词,即假设不发生溢出,如何保证不溢出呢?

    计算机是这样做的,为保证补码算术左移时不发生溢出,移位的数据最高有效位必须与符号位相同。什么叫移位的数据最高有效位,即移位后,成为最高符号位的数据位。在不发生溢出的前提下,用硬件实现补码的算术左移时,直接将数据最高有效位移入符号位,不会改变机器数的符号。

    移位的数据最高有效位必须与符号位相同?和后面这句话是什么意思啊~?是说算术左移和逻辑左移的意义一样?~...~but~但是意义何在~?

    取一字节为例,能表示的数字从 -128 ~ 127

    先看正数,比如 9,就是 0000 1001,最高位(符号位)和数据最高位都是 0. 左移得到 0001 0010 也就是 18,再看负数 -9,就是 -(0000 1001) 也就是 1111 0110 + 1 即 1111 0111,最高位(符号位)和数据最高位都是 1. 左移后是 1110 1110,反过来是 (1110 1101 + 1)->0001 0010,就是 -18 了。

    如果数据最高位和符号位不同的话,说明这个数字的绝对值已经超过 64 了,那么左移一位后必然溢出。

    所以一个【有效的】左移最高位和数据最高位必然一致。故算术左移和逻辑左移一样。

    1. 算术移位和逻辑移位的比较
      根据上述的描述,可以归纳出(均为补码操作):
      1. 当一个【有效的】左移最高位和数据最高位一致时,算术左移和逻辑左移一样,均为右补0,不一致时,算术左移溢出,无意义!
      2. 逻辑右移很简单,只要将二进制数整体右移,左边补0即可 ,算术右移,左侧均补符号位,即正数补0,负数补1。
        不清楚的可以回头看看上文解析!

    其中逻辑移位最简单,不管左移右移,移出来的空位补0即可。

    算术移位特别需要注意,原来的符号位一样移动。因为移位是宏观的变化,不允许任何元素保持不动。所以左移时,正数有可能变为负数,负数有可能变为正数。因为左移原来的符号位丢了,右边补的是0。而右移时不会改变符号性,因为右移是将数据减半,减半不可能减成相反的符号的。而左移可能溢出,溢出的特征就是符号跃迁。

    拓展知识

    java移位运算符:<<(左移)、>>(带符号右移)和>>>(无符号右移)

    1. <<(左移)
      左移的规则只记住一点:丢弃最高位,0补最低位(此时也会溢出,但是我们也应该尽量避免这种溢出)
      如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了332=1位。
    2. >>(带符号右移)
      右移的规则只记住一点:符号位不变,左边补上符号位
      按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1
    3. >>>(无符号右移)
      无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位
      无符号右移规则和右移运算是一样的,只是填充时不管左边的数字是正是负都用0来填充,无符号右移运算只针对负数计算,因为对于正数来说这种运算没有意义无符号右移运算符>>> 只是对32位和64位的值有意义


    关注微信公众号,持续更新!

    330efa1641f70acf00157cf1937a37db.png
    展开全文
  • 计算机的逻辑运算的算术运算的主要区别是:逻辑运算是按位进行的,位与位之间不像加减运算那样有进位或借位的联系。逻辑运算主要包括三种基本运算:逻辑加法(又称“或”运算)、逻辑乘法(又称“与”运算)和逻辑否定...
  • 二进制的运算方法

    千次阅读 2016-01-10 02:15:44
    电子计算机具有强大的运算能力,它可以进行两种运算:算术运算和逻辑运算。1.二进制的算术运算 二进制的算术运算包括:加、减、乘、除四则运算,下面分别予以介绍。(1)二进制数的加法 根据“逢二进一”...
  • 很大可能是人类有10根手指,如果是海豚,也许它会发明二进制:)二进制和十进制没有很大区别,都是用来计数,但二进制还可以用来做逻辑运算,而逻辑运算才是计算机最擅长做事情。我们在学校里学习计算机组成...
  • 很大可能是人类有10根手指,如果是海豚,也许它会发明二进制:)二进制和十进制没有很大区别,都是用来计数,但二进制还可以用来做逻辑运算,而逻辑运算才是计算机最擅长做事情。我们在学校里学习计算机组成...
  • 二进制的运算规则

    万次阅读 2018-08-24 10:14:32
     (3) 乘法运算规则 例如:二进制数之间可以执行算术运算和逻辑运算,其规则简单,容易实现。  (1) 加法运算规则  0 + 0 = 0 例如: 1 1 0 1  0 + 1 = 1 +) 1 0 0 1  1 + 0 = 1  1 + 1 = 0 (产生进位) ...
  •  电子计算机具有强大的运算能力,它可以进行两种运算:算术运算和逻辑运算。 1.二进制的算术运算  二进制的算术运算包括:加、减、乘、除四则运算,下面分别予以介绍。 (1)二进制数的加法  ...
  • 研究了光学负二进制并行算术运算。基于符号数字负二进制表达,提出了任意字长操作数并行两步加法与一步减法。这些基本运算都可通过空间编码与解码光学逻辑实现,从而提供了一种有效光学算术-逻辑单元(ALU)...
  • 这是因为原码与二进制数真值绝对值是完全一样算术移位并不涉及数符号。 ② 补码移位:由于正数补码与原码是一样,所以正数补码左、右移位所出现空位补 0 均不会改变补码形态。值得注意是负数...
  • 二进制运算

    2010-02-21 16:59:03
    1、二进制的算术运算  二进制数的算术运算非常简单,它的基本运算是加法。在计算机中,引入补码表示后,加上一些控制逻辑,利用加法就可以实现二进制的减法、乘法除法运算。 1)二进制的加法运算  二进制...
  • 二进制逻辑运算详解

    2009-08-17 19:04:43
     计算机的逻辑运算的算术运算的主要区别是:逻辑运算是按位进行的,位与位之间不像加减运算那样有进位或借位的联系。 逻辑运算主要包括三种基本运算:逻辑加法(又称“或”运算)、逻辑乘法(又称“与”运算)...
  • 算术运算逻辑运算

    千次阅读 2013-06-17 11:47:30
    逻辑运算又称布尔运算,取值只有两个真或假,二进制数10在逻辑上可以代表真与假,是与否 算术运算...小学就开始学了 两者区别在与逻辑运算是按位进行,位与位之间没有进位或借位. 逻辑加法(OR)OR OPRD1,OPRD2 ;...
  • 下面从逻辑右移和算术右移角度进行分析。 【分析】 1 逻辑右移和算术右移 逻辑右移,移走位填充为0;算术右移,移走位填充与符号位有关,例如如果为负数,则移走位填充为1。 2 unsigned int int ...
  • 二进制常用运算 ... 计算机的逻辑运算的算术运算的主要区别是:逻辑运算是按位进行的,位与位之间不像加减运算那样有进位或借位的联系。 逻辑运算主要包括三种基本运算:逻辑加法(又称“或”运算)、逻辑...
  • 主要内容进制及其转换标识符、关键字常量...人类使用二进制:计算机使用八进制十六进制:为了更好表示二进制(缩短二进制长度)各进制数之间关系1.2 计算机为什么使用二进制物理上容易实现,可靠性强;运算简单...
  • 二进制除法怎么算(共2篇)二进制的运算法则1 2 微型计算机运算基础1 2 1 二进制数的运算方法电子计算机具有强大的运算能力,它可以进行两种运算:算术运算和逻辑运算。1.二进制数的算术运算二进制数的算术运算包括:...
  • C语言中有逻辑运算和算术运算两种操作,数据在内存中都是以二进制转换其补码存放。显然,直接使用位操作要比其他操作效率高,下面我们来通过一些 代码看一下两者区别: int a = -1; // 1111 1111 1111 1111 1111...
  • 比如一个有符号位8位二进制数11001101,逻辑右移就不管符号位,如果移一位就变成01100110。算术右移要管符号位,右移一位变成10100110。 逻辑左移=算数左移,右边统一添0 逻辑右移,左边统一添0 算数右移,左边...
  • 移位运算是将数值向左向右移动,对于十进制来说就是实现放大十倍缩小十倍效果,而对于二进制而言就是放大两倍缩小两倍效果。整数乘除法一个自己曾经忽视东西,那就是C/C++中移位操作容易出错...
  • 二进制代码

    2020-09-14 00:30:38
    二进制的算术运算 无符号二进制的算术运算 带符号二进制数的减法运算 二进制代码 二-十进制码 格雷码 ASCII码 二值逻辑变量与基本逻辑 逻辑函数及其表示方法 逻辑函数的几种表示方法 逻辑函数表示方法之间的转化...
  • 莱布尼兹的二进制布尔的全无假定 ...但没有料到的是,这种几乎是在象征智力低下的二进制,后来被莱布尼兹发现:它十进制的数字是可以互相转换的,而且几乎所有的算术运算都可以转换。于是,对这种二进制的思辨就...
  • 算术运算电路

    2021-02-03 17:45:27
    两个1二进制的加法运算如下表所示,其中S表示和数C表示进位数。由表中逻辑关系可见,这种加法运算只考虑了两个加数本身,而没有考虑由低位来的进位,所以称为半加。半加器就是实现下面这个真值表关系的电路。 由...
  • 右移是二进制除法,分为逻辑右移和算术右移。 逻辑右移 不管前面是都补0,更多时候用来做逻辑除,不能用来做算数除。 算术右移 算术右移会根据你首位来决定补1或补0。 ...
  • 运算器基本功能是完成对各种数据加工处理,例如算术四则运算,与、或、求反等逻辑运算算术和逻辑移位操作,比较数zhidao值,变更符号,计算主存地址等。运算器中寄存器用于临时保存参加运算数据和...

空空如也

空空如也

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

二进制的算术运算和逻辑运算