左移,右移,无符号移动,原反补码

2的6次方 64
2的7次方 128
2的8次方 256
2的9次方 512
2的10次方 1024
2的11次方 2048
2的12次方 4096
2的13次方 8192
2的14次方 16384

左移:

12345
0000 0000 0000 0000‭ 0011 0000 0011 1001‬

<<1 左移一位
000 0000 0000 0000‭ 0011 0000 0011 1001‬ 0,
左边第一位被舍弃,右边补0。

相当于12345 * 2
位移后十进制数值变成:24690,刚好是12345的二倍

12345左移18位
12345
0000 0000 0000 0000‭ 0011 0000 0011 1001‬
11 0000 0011 1001 ‬0000 0000 0000‭ 0000 00

此时二进制表达首位为1,此时数值为 -1058799616,
同理,如果继续位移,左位移20位,则值为 59768832 又变成了正数

如果任意一个十进制的数左位移32位,右边补位32个0,十进制岂不是都是0了?
当然不是!!!
当int 类型的数据进行左移的时候,
当左移的位数大于等于32位的时候,位数会先求余数,然后再进行左移,

也就是说,如果真的左移32位 e << 32 的时候,
会先进行位数求余数,即为 e<<(32%32) 相当于 e<< 0 ,

所以e<< 33 的值和e<<1 是一样的,都是 24690

右移

12345
0000 0000 0000 0000‭ 0011 0000 0011 1001‬

1

00000 0000 0000 0000‭ 0011 0000 0011 100
左边补0,右边第一位被舍弃。(如果是1,负数,那就补1)

6172 和int 类型的数据12345除以2取整所得的值一样

如果继续右移,直接右移14位,即为e>>14,则结果为0 ,
其过程和左移相似,就不一一演示了;另外,对于超过32位的位移,和左移运算符一样,,会先进行位数求余数

无符号右移运算符:>>>

无符号右移运算符和右移运算符是一样的,
不过无符号右移运算符在右移的时候是补0的,
而右移运算符是补符号位的

-12345
1111 1111 1111 1111 1100 1111 1100 0111
取这正数的反码,在+1
0000 0000 0000 0000‭ 0011 0000 0011 1001‬(这是正数12345)

1
01111 1111 1111 1111 1100 1111 1100 011
左边补0

1
11111 1111 1111 1111 1100 1111 1100 011

原码、反码和补码

一个数可以分成符号位(0正1负)+ 真值,原码是我们正常想法写出来的二进制

由于计算机只能做加法,负数用单纯的二进制原码书写会出错,
于是大家发明了反码(正数不变,负数符号位不变,真值部分取反);

再后来由于+0, -0的争端,于是改进反码,
变成补码(正数不变,负数符号位不变, 真值部分取反,然后+1)

二进制前面的0都可以省略,
所以总结来说:计算机里的负数都是用补码(符号位1,真值部分 取反 +1)表示的。

2、位运算符和2的关系
位运算符和乘2 除2 在大多数时候是很相似的,可以进行替代,同时效率也会高的多,但是两者切记不能混淆 ;

很多时候有人会把两者的概念混淆,尤其是数据刚好是 2、4、6、8、100等偶数的时候,看起来就更相似了,

但是对于奇数,如本文使用的12345 ,右移之后结果为6172 ,
这个结果就和数学意义上的除以2不同了,不过对于int 类型的数据
,除2 会对结果进行取整,所以结果也是6172 ,这就更有迷惑性了

链接:https://www.jianshu.com/p/927009730809

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值