1. 理解移位操作之前先要弄清楚什么是原码、反码和补码
所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
原码10010 -> 反码11101 (10010,1为符号码,故为负)
(11101) 二进制= -2 十进制
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
例如:
原码
[+7]原= 0 0000111 B
[-7]原= 1 0000111 B
反码
[+7]反= 0 0000111 B
[-7]反= 1 1111000 B
补码
[+7]补= 0 0000111 B
[-7]补= 1 1111001 B
2. 移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:
<<(左移)、>>(带符号右移)和>>>(无符号右移)。
在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是
移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,
也就是移动66次和移动2次得到的结果相同。
三种移位运算符的移动规则和使用如下所示:
<<运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
语法格式:
需要移位的数字 << 移位的次数
例如: 5<<1,则是将数字5左移1位
计算过程:
5<<1
首先把5转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0101,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移1位,
最后在低位(右侧)的一个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1010,则转换为十进制是10.数学意义:
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
-5<<1 =-10
>>运算规则:按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1.
如果最高位是0,那么左边最高位就补0; 如果最高位是1,那么左边最高位就补1(负数要用补码,正数补码跟原码一样)
语法格式:
需要移位的数字 >> 移位的次数
例如5>>2=1,则是将数字5右移2位
计算过程:5的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0101,然后把低位的最后两个数字移出,因为该数字是正数,所以在
高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0001.转换为十进制是1.
数学意义:右移一位相当于除2,右移n位相当于除以2的n次方(不能整除的用取整)。
例如-5>>2=-2 则是将数字-5右移2位
计算过程:
-5的二进制形式:1000 0000 0000 0000 0000 0000 0000 0101
转换成补码:1111 1111 1111 1111 1111 1111 1111 1011
移位高位补1:1111 1111 1111 1111 1111 1111 1111 1110
再转换成原码:1000 0000 0000 0000 0000 0000 0000 0010
得到结果-2
>>>运算规则:按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。
其他结构和>>相似。
-5>>>2 = 2^30-2
原码 1000 0000 0000 0000 0000 0000 0000 0101
反码 1111 1111 1111 1111 1111 1111 1111 1010
补码 1111 1111 1111 1111 1111 1111 1111 1011
无符号右移两位 0011 1111 1111 1111 1111 1111 1111 1110 +2-2
0100 0000 0000 0000 0000 0000 0000 0000 -2 = 2^30-2
5>>>2=1 和5>>2 相同