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