6
回答
java 移位运算符 无符号右移求解
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

今天看了一下java 移位运算符  无符号右移(>>>),不知道它是如何计算的?

int i = -1;
System.out.println(i >>>= 1);



输出结果是:2147483647

请问大神们无符号右移(>>>)是如何运算的?很困惑

举报
益达先生
发帖于4年前 6回/1K+阅
共有6个答案 最后回答: 4年前

-1在计算机的表示是什么?补码

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

java int 占几个字节

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

无符号右移动,高位怎么填充

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

十进制结果

有符号的数移位的结果是没有规定的,取决于编译器。

看你这个结果,移位后前面应该是没有补1。

回楼上

int i =-1;
System.out.println(Integer.toBinaryString(i));//11111111111111111111111111111111
i>>>=1;//01111111111111111111111111111111,左侧补零
System.out.println(Integer.parseInt("01111111111111111111111111111111",2));//2147483647



int -1 == 0xFFFFFFFF == 二进制32个1.
0xFFFFFFFF >>> 1  == 0111 1111 ..... 1111 == 0x7FFFFFFF == 2147483647

>>>连着符号一块位移了.首位丢失符位.就变成正数了.

至于为什么0xFFFFFFFFF == - 1. 你网上搜下.东西比较多.

引用来自“ljiang”的答案

回楼上

int i =-1;
System.out.println(Integer.toBinaryString(i));//11111111111111111111111111111111
i>>>=1;//01111111111111111111111111111111,左侧补零
System.out.println(Integer.parseInt("01111111111111111111111111111111",2));//2147483647



java编译器不是很了解,gcc和VS系列下负数移位后左侧补的是1,所以负数右移也是负数。

--- 共有 2 条评论 ---
hecaptain回复 @NealFeng : 长知识了。 4年前 回复
NealFengjava里,int或long默认都是有符号数,和C里的singed一样,所以>>就是按有符号数去移动,>>>就是按无符号数去移动。 4年前 回复

引用来自“cobbage”的答案

-1在计算机的表示是什么?补码

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

java int 占几个字节

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

无符号右移动,高位怎么填充

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

十进制结果

谢谢,这个过程很不错,容易理解
顶部