一、逻辑运算的引入
- 如果现在只是将数据存到计算机的容器中,是没有任何意义的,我们还需要告诉计算机这些数据有什么用,让计算机对这些数做运算。所以我们知道计算机到底是如何做运算的,所以我们引入逻辑运算
二、逻辑运算
-
由于计算机受硬件的限制影响,CPU再复杂可以理解为一条条的线路组成的,而电信号只有两种形式0和1,所以一般计算机的逻辑运算的对象都是二进制数
-
逻辑运算分为:
逻辑运算 汇编符号 C语言符号 或 or | 与 and & 异或 xor ^ 非 not !
三、逻辑运算的应用
1.CPU是如何计算2+3
-
我们如果用汇编语言写2+3,两个指令就可以搞定,但是对于计算机收到这个指令,计算机只会对以二进制存储的数据做逻辑运算得出结果,而计算机不会做加法运算
mov eax,2 add eax,3
-
CPU做逻辑运算
#x,y,R为存储数据的容器 2+3 x:0010 y:0011 0010 xor 0011 ------------ 0001 R:0001 0010 and 0011 ------------ 0010 <<1 得 0100 #<<1表示左移一位 此时计算机会判断0100是否全为0,如果全为0表示运算结束,将R中此时的值作为结果输出,如果不为0则将R中的值赋给x。0100赋给y再做一次同样运算 0001 xor 0100 ------------- 0101 R:0101 0001 and 0100 ------------- 0000 <<1 得 0000 判断0000全为0,则运算结束,将R中的值0101作为运算的结果,化成十进制即为5
2.如何获取某个值的第N位是0还是1
-
比如现在某个寄存器中存了一个值,值化成二进制时,有些特殊的值每一位都有它的特殊含义,所以我们想要知道这个值的第N位是0还是1。如果我们把寄存器中的值取出来,一个一个数着看,就会很麻烦,但是如果做下面的运算,就会容易很多:
#现在想要查看某寄存器中的值的第4位是0还是1,我们就可以将寄存器中的值与0x08做与运算,如果得到结果中有一个1,则这个值的第四位就是1,如果结果全是0,则值的第四位就是0 10001111 and 00001000 ---------------------- 00001000
3.用亦或做加密解密
-
如果进行简单的加密,可以使用亦或运算,因为选择一个双方都知道密钥,用此密钥与数据做亦或加密加密过后,别人如果没有密钥则不好解开这个密文,而对于接受方,使用相同的密钥再做一次亦或即可得到原来的明文值
要加密的数据:2015 00100000 00010101 ^ 01010100 ^ 01010100 ------------ ------------ 密钥:54 01110100 01000001 加密后的结果: 74 41 01110100 01000001 ^ 01010100 ^ 01010100 ------------- ------------ 00100000 00010101 解密后的结果: 20 15
四、作业
1.八进制2-5
因为计算机做任何运算,都需要先将数据存到某数据宽度的寄存器中,所以一定要指明数据宽度!!
-
2-5等于-3,这个-3要看存储容器的数据宽度了,如果数据宽度是8位,那么刚刚讲过有符号数是这么存储的:FF是最大的负数-1,那么往前推,FE表示-2,FD表示-3,即结果化成十六进制就是FD,至于最后答案要化成二进制还是八进制,计算机不管,计算机只管将-3在8位宽度的容器中表示为FD。同理如果是16位容器,则结果为FFFD;32位容器,则结果为FFFFFFFD。(其实不用下面的图也可以使用反码补码源码的计算将-3的结果计算出来)
2.只用逻辑运算计算2-3
2-3
假设数据宽度为4bit
-3在计算机中存储方式:先把-3表示出来1011,最高位为符号位,然后除符号位其他位取反最后加1即可(即原码转补码)
所以-3 = 1011 --> 1100 --> 1101 --> D,即计算机收到-3后会将-3用二进制1101存储(数据宽度为4字节)
x:0010
y:1101
0010
xor 1101
----------
1111 R:1111
0010
and 1101
----------
0000 <<1 得0000
所以最终结果为1111,注意这只是计算机存储的形式,十六进制为F
根据计算机底层存储原理可以得到F表示最大的负数-1,可得到答案为-1;也可以通过1111除符号位取反1000,然后+1的1001,也可以得到答案是-1