我是靠谱客的博主 乐观冬瓜,最近开发中收集的这篇文章主要介绍左移和右移的运算规则_计算机的位移运算,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近看编程思想看到操作符这章实在不理解位运算那地方的例子:

其实就是不明白计算机中是怎么进行位运算和负数是怎么表示的。网上查阅博客都是千篇一律,没有解决问题,且没有根据,今天看到《码出高效》这本书还没看过,就翻开看看,第一章就是讲位运算,看完之后豁然开朗,总结下计算机中是怎么进行位运算的。

一、计算机中负数的运算

计算机中是以二进制补码进行存储的,正数的原码、反码、补码都是一样,负数的补码是原码的反码再加1,这样可以减法运算可以使用加法器实现,符号位也参与运算二进制的最高位为符号位0为正,1为负,以8位来算,最高位为符号位,其余7位表示数值),取反码与符号位无关。

eg:

47 + (-47) 在计算机中这样运算
  0010 1111
+ 1101 0001 (-47的补码)  原码:1010 1111 补码:1101 0001
------------
  0000 0000(遇2进1,最后的结果就是0)

二、移位操作

移位分为有符号左移(<<),有符号右移(>>)

无符号右移(>>>)没有无符号左移(<<<)

1、有符号位移运算,何为有符号左移、右移,因为计算机中符号位最高位0代表正数,1代表负数,所以正数有符号右移高位补0,负数有符号右移高位补1,不管有无符号位移运算左移低位都是补0。

借书上的的例子:

a97e4314be1795b6d4dad46d1faa1670.png

负数位移运算根据补码来移位(符号位也要跟着移位,取反码与符号位无关,符号位不参与数值表示

最终高位如果为0,说明正数不用进行操作,按照二进制转换成十进制就是结果了。

如果高位为1,说明是负数,也就是补码,可以补码减1再取反码就是原码了,也可以根据结果取反码再加1就是原码(补码的补码就是原码),按照二进制转换成十进制就是结果了。

2、无符号位运算

无符号位移运算意思是我不关心你的符号位,(而有符号位移运算会根据是正数还是负数高位会进行不同的补位),不管正数负数高位都补0,只有无符号右移(>>>),没有无符号左移(<<<),因为符号位在左边,你往左移影响不到符号位,没有意义。

继续借书上的例子(允许偷点懒)

f246c46650baccf19d0e9850b3e70b3f.png

总结:

1、计算机中是以补码进行存储的,最高位为符号位。

2、符号位不参与反码,符号位不参与数值表示,符号位参与位移运算移位,符号位参与运算加法

3、位移运算移动按补码进行移动,结果的高位为0,说明是正数,不需要操作

如果高位为1,说明是负数,得到的结果是补码,则取反加1得到原码

4、输入给计算机的二进制码,计算机会当作原码进行处理,而计算机输出的二进制码是补

码(正数的补码即原码,负数需要转换得到最终的结果)

码出高效这本书全是干货,后面应该会有更大的惊喜。

最后

以上就是乐观冬瓜为你收集整理的左移和右移的运算规则_计算机的位移运算的全部内容,希望文章能够帮你解决左移和右移的运算规则_计算机的位移运算所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部