移位运算和乘除运算的关系

移位运算和乘除运算的关系,在了解了二进制数的机制后,接下来我们来看一下运算。和十进制数一样,四则运算同样也可以使用在二进制数中,只要注意逢2进位即可。下面,我们就来重点看一下二进制数所特有的运算。二进制数所特有的运算,也是计算机所特有的运算,因此可以说是了解程序运行原理的关键。
首先我们来介绍移位运算。移位运算指的是将二进制数值的各数位进行左右移位(shift=移位)的运算。移位有左移(向高位方向)和右移(向低位方向)两种。在一次运算中,可以进行多个数位的移位操作。

代码清单2-1中列出的是把变量a中保存的十进制数值39左移两位后再将运算结果存储到变量b中的C语言程序。<<这个运算符表示左移,右移时使用>>运算符。<<运算符和>>运算符的左侧是被移位的值,右侧表示要移位的位数。那么,这个示例程序运行后,变量b的值是多少,大家知道吗?

代码清单2-1 将变量a的值左移两位的C语言程序

a =39;
b =a << 2;

如果你认为“由于移位运算是针对二进制数值的位操作,十进制数39的移位操作就行不通了”,那么就请重新读一下本章的内容。无论程序中使用的是几进制,计算机内部都会将其转换成二进制数来处理,因此都能进行移位操作。但是,“左移后空出来的低位,要补上什么样的数值呢?”想到这个问题的人真是思维敏锐!空出来的低位要进行补0操作。不过,这一规则只适用于左移运算。至于右移时空出来的高位要进行怎样的操作,我们会在后面说明。此外,移位操作使最高位或最低位溢出的数字,直接丢弃就可以了。

接下来让我们继续来看代码清单2-1。十进制数39用8位的二进制表示是00100111,左移两位后是10011100,再转换成十进制数就是156。不过这里没有考虑数值的符号。至于其原因,之后大家就知道了。

移位运算和乘除运算的关系
图2-4 左移两位的运算

实际的程序中,移位运算以及将在本章最后介绍的逻辑运算在使用位单位处理信息的情况下比较常用。虽然这里没有列举具体的程序示例,但对程序员来说,掌握位运算和逻辑运算的机制是一项基本技能,所以一定要掌握。形象地说,移位运算就好比使用二进制表示的图片模式像霓虹灯一样左右流动的样子。
不过,移位运算也可以通过数位移动来代替乘法运算和除法运算。例如,将00100111左移两位的结果是10011100,左移两位后数值变成了原来的4倍。用十进制数表示的话,数值从39(00100111)变成了156(10011100),也正好是4倍(39×4=156)。

其实,反复思考几遍后就会发现确实如此。十进制数左移后会变成原来的10倍、100倍、1000倍……同样,二进制数左移后就会变成原来的2倍、4倍、8倍……反之,二进制数右移后则会变成原来的1/2、1/4、1/8……这样一来,大家应该能够理解为什么移位运算能代替乘法运算和除法运算了吧。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!