相信学过c语言的人都知道 移位 运算符是怎么一回事吧,关于移位运算符有<<和>>两种
<< ---------------------------- 它会在右端补上0
>> 逻辑右移(适用于unsigned即无符号类型)-----------------它会在在左端补0
>> 算术右移(有符号类型)---------------------------在左端补上最高有效位数字
学过计算机组成原理的人应该知道,计算机执行乘法和除法其实是很复杂的一个过程,大概上执行一个乘法要10个时钟周期左右,而执行一条移位运算或者加法运算只需要哟个时钟周期,所以移位运算的效率比较高。其实仔细观察我们是可以用移位运算和加法运算来实现乘法和除法的。
乘法:
(1). 比如 X * 14 <==> (X<<3) + (X<<2) + (X<<1) <==> (X<<4) - (X<<1)
14 = 8 + 4 + 2 = 16 - 2
(2). 又比如X * 3 <==> (X<<1) + X
除法:
除法相对来说比较复杂因为我们需要考虑 正负数 以及 逻辑右移 与 算术右移(与乘法相反,除法使用右移来实现的),具体分析过程我就不口述了,因为表达能力不是很好,怕大家看不明白,而我在深入理解计算机系统一书中有讲到,所以我就引用它的话
我们不难看到用右移现实除2是可以的,但是遗憾的是它并不能推广到任意k进制除法,计算机不得不依靠其他方法来解决,具体是怎么解决的我还需要进一步研究,大家也可以自己研究研究,给我留下宝贵意见^_^