JAVA表达式 a >>> 2什么意思

 我来答
liuyibo31
2010-06-21 · TA获得超过874个赞
知道小有建树答主
回答量:270
采纳率:0%
帮助的人:0
展开全部
你看下这篇文章就清楚了

首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。

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

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

例子:

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位

}

输出结果

12
-12
1
-2
下面解释一下:

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

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

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

这也说明了一个问题:在计算机中,以1开头的就是补码的形式,是负数。

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

00000000 00000000 00000000 00000110 +6在计算机中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 -6在计算机中的表示
1111111111 11111111 11111111 11111010 右移两位,结果为负数
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 00000110 右移两位,正数补0,结果为1
-----------------------------------------------------------------------------------------------------

00000000 00000000 00000000 00000110 +6在计算机中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 -6在计算机中的表示
0011111111 11111111 11111111 11111010 右移两位,补充0,结果为1073741822

以下来自:http://jefflee.javaeye.com/blog/203863

可以参考

移位操作要注意的问题是高(低)位是补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。当时在使用这三个操作符对 byte, char, short型数据进行操作时要注意,例如有一下代码片段:
YUXUERUI
2010-06-21 · TA获得超过1702个赞
知道小有建树答主
回答量:907
采纳率:0%
帮助的人:518万
展开全部
">>>" 这个其实是java的一种运算符,和 > < = 那些差不多的,都是用来计算的

>>> 在java里叫做"位移运算符", 用这种运算符的前提是把准备运算的数字转换成二进制,再来进行位移运算。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
河蟹和谐河蟹
2010-06-21 · TA获得超过1156个赞
知道小有建树答主
回答量:1028
采纳率:0%
帮助的人:789万
展开全部
我没记错的话应该等同于C的

a >>= 2;
也就是a等于a右移2位。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liujiananxx
2010-06-21 · TA获得超过395个赞
知道小有建树答主
回答量:325
采纳率:100%
帮助的人:184万
展开全部
a等于a右移2位
和C,C++,C#都一样
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
懿宸忆尘南波兔
2019-03-06
知道答主
回答量:3
采纳率:0%
帮助的人:2220
展开全部
public static void main(String[] args) {
   /*
    * 原码:00000000 00000000 00000000 00000101
    * 反码:00000000 00000000 00000000 00000101
    * 补码:00000000 00000000 00000000 00000101
    * 左移:00000000 00000000 00000000 00010100
    * 结果:20
    */
   System.out.println(5<<2);
   /*
    * 原码:10000000 00000000 00000000 00000101
    * 反码:11111111 11111111 11111111 11111010
    * 补码:11111111 11111111 11111111 11111011
    * 左移:11111111 11111111 11111111 11101100
    * 逆补码:11111111 11111111 11111111 11101011
    * 反码:10000000 00000000 00000000 00010100
    * 结果:-20
    */
   System.out.println(-5<<2);
   /*
    * 原码:00000000 00000000 00000000 00000101
    * 反码:00000000 00000000 00000000 00000101
    * 补码:00000000 00000000 00000000 00000101
    * 右移:00000000 00000000 00000000 00000001|01
    * 结果:1
    */
   System.out.println(5>>2);
   /*
    * 原码:10000000 00000000 00000000 00000101
    * 反码:11111111 11111111 11111111 11111010
    * 补码:11111111 11111111 11111111 11111011
    * 右移:11111111 11111111 11111111 11111110|11
    * 逆补码:11111111 11111111 11111111 11111101
    * 反码:10000000 00000000 00000000 00000010
    * 结果:-2
    */
   System.out.println(-5>>2);
   /*
    * 原码:00000000 00000000 00000000 00000101
    * 反码:00000000 00000000 00000000 00000101
    * 补码:00000000 00000000 00000000 00000101
    * 右移:00000000 00000000 00000000 00000001|01
    * 结果:1
    */
   System.out.println(5>>>2);
   /*
    * 原码:10000000 00000000 00000000 00000101
    * 反码:11111111 11111111 11111111 11111010
    * 补码:11111111 11111111 11111111 11111011
    * 右移:00111111 11111111 11111111 11111110|11
    * 逆补码:00111111 11111111 11111111 11111110
    * 反码:00111111 11111111 11111111 11111110
    * 结果:1073741822
    */
   System.out.println(-5>>>2);
   }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式