欢迎光临
箫启灵个人站点

[汇编基础] 位运算 计算机最底层的加减乘除是如何实现的。

为什么有位运算?

因为计算机底层,是没有加减乘除的运算的,底层都是二进制数据,二进制数据要实现我们常用的加减乘除,就需要通过位运算来实现。

那么,如果想学逆向,到底要不要学位运算呢?

答案:需要了解,不是特别重要。

位运算的用途

有些特殊场景,可能需要你对某段二进制数据中的某一位值进行修改,这个时候就需要用到位运算。 

位运算是最底层的运算方式,速度也是最快的。例如,有些面试题会问 2*8的最高效的实现方式是什么? 

位运算介绍

1、与运算

两个位都为1时,结果才为1

比如:

       1011 0001 

  and(&)   1101 1000

——————————————

       1001 0000       

2、或运算

只要有一个为1就是1

比如:

       1011 0001

  or(|)  1101 1000

——————————————

      1111 1001

3、异或运算  

不一样的时候是1 

比如:

       1011 0001 

  xor(^)   1101 1000

——————————————

   0110 1001

4、非运算

0就是1  1就是0

比如:

  not(~)        1101 1000

——————————————

            0010 0111

5、左移

各二进位全部左移若干位,高位丢弃,低位补0

比如:

  shl(<<)         1101 1000  左移2位为:0110 0000

6、右移

各二进位全部右移若干位,低位丢弃,高位补0或者补符号位

比如:

shr    1101 0101       0011 0101 高位补0

对应C语言(>>)

unsigned int a = 10; 

printf("%d\n",a>>2); 

sar    1101 0101      1111 0101   高位补符号位

对应C语言(>>)

int a = 10;

printf("%d\n",a>>2); 

计算机底层,加法 减法 运算

A+b

先A异或B。得到结果C

再A与(&)B 运算 得到结果D   判断D是否进位,如果进位,左移一位。  如果没有进位,C就是A+B的结果。

D进位后结果,跟C异或。得到结果E

D进位后结果,跟C &运算 得到结果F

判断F是否进位,如果没有,则E就是A+B结果,如果进位了,就继续进位,异或……………..

下图是 4+5 的位运算流程

clipboard.png

减法跟加法一样。例如 1-2 其实就是1+(-2)

乘法运算 本身就是加法运算。 除法运算,本身就是减法运算。

2*8的最高效的实现方式

2*8 其实就是 2+2+2+2+2+2+2+2

2的二进制为 0010
2+2+2+2+2+2+2+2 的位运算结果是  0001 0000    (10,16进制)
所以,2*8的最高效实现方式就是直接  左移 3位


位运算实现简单的加密与解密

原文 0010
秘钥 1100

加密
     0010

xor(^) 1110

————-
     1100 

解密
     1100 

xor(^) 1110

————-
     0010

未经允许不得转载:箫启灵博客 » [汇编基础] 位运算 计算机最底层的加减乘除是如何实现的。

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

刺蝴蝶De箫启灵

作死购站点VIP视频站站点