java的移位操作详解

java的移位操作详解:左移和右移

以前很怕这个东西 ,一看见就头大,今天下决心解决它。^~^

左移位:<<,有符号的移位操作
左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充


右移位:>>,有符号的移位操作
右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充。
eg:


public class ShiftMath{
	public static void main(String[] args){

	System.out.println(3<<2);	// 3左移2位
	System.out.println(-3<<2);	// -3左移2位

	System.out.println(6>>2);	// 6右移2位
	System.out.println(-6>>2);	// -6右移2位

}
}



输出结果
  3左移2位后:12
-3左移2位后:-12
  6左移2位后:1
-6左移2位后:-2

下面解释一下:
左移:
正数左移:

00000000 00000000 00000000 00000011 +3在计算机中表示
00000000 00000000 00000000 00000011。00  左移2位,补0,结果为12

----------------------------------------------------------------------------------------------
负数左移

00000000 00000000 00000000 00000011 +3在计算机中表示

11111111 11111111 11111111 11111100取反-> -3的补码

11111111 11111111 11111111 11111101 -3在计算机中表示
11111111 11111111 11111111 11111101。00  左移2位,补0,结果为负数,就是补码了,求原码
10000000 00000000 00000000 00001011

10000000 00000000 00000000 00001100 结果-12
这也说明了一个问题:在计算机中,负数都 使用以1开头的补码形式计算。

-----------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------

右移:

正数右移:
00000000 00000000 00000000 00000110  +6在计算机中表示方法
0000000000 00000000 00000000 000001。10  右移两位,正数补0,结果为1

----------------------------------------------------------------------------------------------
负数右移:

00000000 00000000 00000000 00000110 +6在计算机中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010  -6在计算机中的表示
1111111111 11111111 11111111 111110。10  右移两位,结果为负数
1000000000 00000000 00000000 000001
1000000000 00000000 00000000 000010  结果为-2



上面解释了带符号的移位操作,下面解释一下不带符号的移位操作
无符号的移位只有右移,没有左移使用“>>>”进行移位,都补充0
例如:


public static void main(String[] args)
{
System.out.println(6>>>2);
System.out.println(-6>>>2);


}


结果:
1

1073741822

分析:
00000000 00000000 00000000 00000110  +6在计算机中表示方法
0000000000 00000000 00000000 000001。10 右移两位,正数补0,结果为1
-----------------------------------------------------------------------------------------------------
00000000 00000000 00000000 00000110  +6在计算机中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010  -6在计算机中的表示
0011111111 11111111 11111111 111110。10 右移两位,负数也补充0,结果为1073741822



移位操作要注意的问题是高(低)位是补0还是补1和对char, byte, short型的操作:
(1)<< : (left-shift), 最低位补0
(2)>> : (signed right-shift), 右移过程使用符号位扩展(sign extension),即如果符号为为1则高位补1, 是0则补0,也就是逻辑右移
(3)>>> : (unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移
(4)移位操作的数据类型可以是byte, char, short, int, long型,但是对byte, char, short进行操作时会先把它们变成一个int型,最后得到一个int型的结果,对long型操作时得到一个long型结果,不可以对boolean型进行操作。
(5)移位操作符可以和=合并起来,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示将a右移两位后的值重新赋给a。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值