近期在学习cup运算原理时,了解到arm无法支持“➗”运算,除法只能使用向右移位来实现,这里介绍一下移位运算的具体实现。本着讲明白的目的,这里我将尽量写的细节,希望对各位读者有所帮助。
一、准备
1.原码、反码、补码
原码
原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。符号位为0则表示为正数,符号位为1则表示为负数。
如:
6的原码为0000 0110
-6的原码为1000 0110
原码是人脑最容易理解和计算的表示方式。
反码
反码的表示方法是:
正数的反码是其本身;
负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
6的原码为0000 0110 反码为 0000 0110
-6的原码为1000 0110 反码为 1111 1001
可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将其转换成原码再计算。
补码
补码的表示方法是:
正数的补码就是其本身;
负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(也即在反码的基础上+1)
6的原码为0000 0110 反码为 0000 0110 补码为 0000 0110
-6的原码为1000 0110 反码为 1111 1001 补码为 1111 1010
对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码再计算其数值。
2. 反码与补码的转换
在做运算时我经常在这个转换中出问题,我这里给出一张图便于直观的展示这个转换的关系。
有图可以看出,反码转化为补码要末位+1,补码转化为反码要末位-1
好了,我们的准备阶段结束了,这些基础知识已经够我们完成目标任务了。
二、向左移位
1. 正数
以6为例,进行左移操作,具体操作如下图所示
这里向左移动一位变成原来的两倍,向左移动两位变成原来的四倍
即 6<<1 = 12 = 6 x 2
6<<2 = 24 = 6 x 2 x 2
于是得出结论,m << n = m x
2. 负数
以-6和-8为例,进行左移操作,具体操作如下图所示
也是证明了上面给出的公式
即m << n = m x
三、向右移位
1. 正数
以6为例,进行右移操作,具体操作如下图所示:
由此可知,右移一位表示除以2
2. 负数
以-6和-8为例,进行左移操作,具体操作如下图所示:
这里向右移动一位变成原来的二分之一,向右移动两位变成原来的四分之一
即 6>>1 = 3 = 6 / 2
6>>2 = 24 = (6 / 2) / 2
于是得出结论,m >> n = m ÷
当然除法还有一种与奇数相除的情况,
一些书上的说法是舍去小数部分,但是这种说法只适用于正数的情况。
在我看来,应该是用于向下取整,比如说,13/2=6,-13/2=-7
于此我们的介绍结束了,希望对各位读者有所帮助,也希望各位多多批评。