A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ﹊佑雨时杰↘ 中级黑马   /  2014-4-29 03:29  /  1205 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

假设:
byte b = (byte)0xF1 ;
那么 System.out.println(b)的结果是 -15 。
我的理由是,1111 0001 ,高位是符号位,所以取反加1等于-15,正确!
-------------------
问题1:
        同样的方法,一下却不行了!
byte b = (byte)0xF1 ;
System.out.println(b>>4) ;
依照我上面的理解,应该是 1111 0001 >> 4 == 0000 1111 == 15 !
但是,答案却是 -1 ?
---------------------------------
我想不太明白,求解释 。
【望详细解释,谢谢!】

4 个回复

倒序浏览
楼主问的问题太简单了,一点技术含量都没有,肯定没好好看视频,
>>和<<都是有符号位移运算符,位移后的二进制最高位是以原数最高位决定, 原来的最高位是1,位移后最高位也补1
原来最高位为0,位移后最高位补0,
也就是说位移的数是正数,位移后还是正数,是负数位移后也是负数
所以1111 0001 >>4  == 1111 1111 == -1


>>>是无符号右移运算符,跟上面俩个不一样的就是,位移后的数都变为正数,最高位都是补0

1111 0001>>>4  == 0000  1111 == 15

楼主 are you  ok

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
如果想得到15的答案,就得用到>>>这个符号,我下面给楼主简单的区别一些>>和>>>,希望能帮到楼主

1.“>>”运算符

“>>”运算符作带符号的位移处理,它作位移处理时,会先将值向右移,并在高位填0,然后将位移后所空出的高位,全部改成原来的最高位的值(代表正负号的位)。也就是说负的值位移后,仍然是负的值,比如:

-10>>2 =-3

-10= 1111 1111 1111 1111 1111 1111 1111 0110

右移2位:0011 1111 1111 1111 1111 1111 1111 1101

结果:1111 1111 1111 1111 1111 1111 1111 1101   (全部天上原本符号位的值:1)

2.“>>>”运算符

“>>>”运算符所作的是无符号的位移处理,它不会将所处理的值的最高位视为正负符号,所以作位移处理时,会直接在空出的高位填入0。当我们要作位移的原始值并非代表数值时(例如:表示颜色图素的值,最高位并非正负号),可能就会需要使用此种无符号的位移。比如:

-10>>>2=1073741821

-10=1111 1111 1111 1111 1111 1111 1111 0110 (不管原来的“符号”位的值(一长串1),空上的全部直接填0)

0011 1111 1111 1111 1111 1111 1111 1101=1037341821

3.“<<”运算符

“>>”运算符的所作的也是无符号的位移处理,同样地,它不会将所处理的值的最高位视为正负符号,它作位移处理时,会直接左移并在低位填入0。所以第二高位以下的位若移到了最高位,该值的正负可能会与原来的不同。

-2147483647<<2=4

-2147483647=1000 0000 0000 0000 0000 0000 0000 0001

0000 0000 0000 0000 0000 0000 0000 0100=4
回复 使用道具 举报
陈云阳 发表于 2014-4-29 04:27
楼主问的问题太简单了,一点技术含量都没有,肯定没好好看视频,
>>和4  == 1111 1111 == -1

恩   你回答的正确了
回复 使用道具 举报
陈云阳 发表于 2014-4-29 04:27
楼主问的问题太简单了,一点技术含量都没有,肯定没好好看视频,
>>和4  == 1111 1111 == -1

恩   你回答的正确了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马