| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1539 人关注过本帖
标题:一个问题
只看楼主 加入收藏
pine
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2004-8-10
收藏
 问题点数:0 回复次数:12 
一个问题

Which of the following results in a negative value of a?

A. int a = -1;a = a >>> 8;

B. byte a = -1;a = (byte)(a>>>5);

C. int a = -1;a = a >>> 5;

D. int a = -1;a = a >>>32;

Answer:BCD

这样的题怎么做???帮忙解释一下,详细点哦~~

搜索更多相关主题的帖子: following 
2004-08-10 13:52
ccnjava
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2004-7-13
收藏
得分:0 
我也不会

小菜鸟看见这个帖子本来想回复,结果看了半天。。。也不会

小菜鸟也有要多地方不明白。。。。

本题只能解答10之1,2。。。惭愧。。 本题是运算符中的位移运算中的无符号数位移运算。 规则是我们根据运算符右面来判断要右移动的位数,然后一律补0。

首先把要移动的数字转换成2进制。然后在移动。因为位移运算本身就是2进制运算

A选项:-1的2进制就是11111111。 比如11111111>>>3右移动三位,然后高位(左边的)补0。为00011111 回到本题,右移8位。变成00000000。0转化成十进制还是0。 C选项:11111111>>>5 移动5位 00000111转10进制=7

看了问题。。一下又有好多新问题不明白。。汗

Q1:负数怎么转换成2进制?我用windows自带的计算器把复数转成2进制以后全是0。 用除法取0我也只会算正数的。。。后来我猜是不是算正数的2进制然后在按位 取反,结果也错了。 不过我看到一本书正好有个例题是-1的2进制11111111 Q2:本题的D选项。。。怎么右移32位。。。如果-1的2进制是11111111 本身只有八位呀?题打错了? Q3:那个B选项,byte是8进制的吧?


特此感谢三位版主对小菜鸟长期以来的帮助 他们是 jellen(类痴狂人 ) tempnetbar(J湖散人 )和Anstey (排名不分先后) 呵呵,这些日子让小菜鸟受益非浅。 忠心的谢谢您们!
2004-08-10 17:36
jellen
Rank: 1
等 级:新手上路
威 望:1
帖 子:107
专家分:0
注 册:2004-5-3
收藏
得分:0 

楼主的题目答案应该是BD吧(c不是),其中:

A: 16777215 B: -1 C: 134217727 D: -1 在Java中int为二进制32位,byte为8位。

然后ccnjava所说的负数转变为二进制的方法: 把负数对应的正数各位取反,然后加1。比如-1,先把-1对应的正数1(0000 0001),各位取反,变成(1111 11110),然后再加1,变成(1111 1110 + 1 = 1111 1111)


再见,理想!
2004-08-10 20:13
ccnjava
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2004-7-13
收藏
得分:0 
解答一点点还错了

我对不起你楼主。。我不是故意的,我很认真的看书,结果还是答错了

再次感谢版主,我一会下去看您的回复


特此感谢三位版主对小菜鸟长期以来的帮助 他们是 jellen(类痴狂人 ) tempnetbar(J湖散人 )和Anstey (排名不分先后) 呵呵,这些日子让小菜鸟受益非浅。 忠心的谢谢您们!
2004-08-10 20:44
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
得分:0 

这个问题初学者确实不易掌握,我来详细的说一下,希望斑竹能列为精华,呵呵

首先,答案错了,是B,D

接下来说说详细过程:

B答案;在byte移位时,系统会将byte转换为int运算,这些都是自动进行的,这也就解释了为什么有个(byte)强制类型转换,所以内存中byte>>>5就是这样的000001111111111111因为byte里的-1存到int中就是1111111111111111所以移位5位后就是上面那样,所以再强制转换后就是11111111,所以也就是-1,这些都是初学者不易注意的细节,高手与菜鸟的区别也正在此处

D答案:在位移运算符运算时对于int自动将位移运算符后面的数字(也就是移几位)模除32,long型模除64,这些数字也就是他们存储所占内存的长度,之所以这样做是为了防止无意义的位移位数,比如int只有32位,你位移了33不就没有意义了吗?而模除32后,位移33位就相当于位移1位了,而小于32的都不受影响,是原来的值,那么位移32位就是位移0,也就是不位移了,所以还是-1

总结一下,对于任何和数字有关的运算,一般运算结果的类型都不小于Int,也就是byte+byte,short+short,byte+short是int,而其他的则是取运算中类型“较大”的那个,比如int+long就是long。位移运算符的模除也不要忽略了。

从上面的可以看到扎实的基础是非常重要的,也是菜鸟和高手的分界岭,大公司对此也是非常看重的,所以大家要好好学习基础,不要以为一些基础的东西似乎都懂了,其实里面还有很大的学问!

[此贴子已经被作者于2004-08-10 21:40:03编辑过]


相信勤能补拙! 喜欢用好用的就永远学不到有用的。
2004-08-10 21:34
jellen
Rank: 1
等 级:新手上路
威 望:1
帖 子:107
专家分:0
注 册:2004-5-3
收藏
得分:0 

呵呵,顶!

tempnetbar的回答解释了D,这是我以前不知道的,学习ing...


再见,理想!
2004-08-11 08:10
ccnjava
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2004-7-13
收藏
得分:0 
小菜鸟

小菜鸟的老师说过学习要有一种本事,要把一本薄书学厚的本事。

现在小菜鸟感觉到了。。。一个知识引出好多知识点。

然后小菜鸟的老师还说过,学厚以后还要有要把厚书学薄的本事。

把书中内容,归纳几个知识点。这个小菜鸟没学会还。。。呵呵


特此感谢三位版主对小菜鸟长期以来的帮助 他们是 jellen(类痴狂人 ) tempnetbar(J湖散人 )和Anstey (排名不分先后) 呵呵,这些日子让小菜鸟受益非浅。 忠心的谢谢您们!
2004-08-11 09:05
pine
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2004-8-10
收藏
得分:0 

谢谢大家的尽力解答,学无止境啊,以后还有许多问题希望大家帮助~~~

2004-08-11 14:09
Anstey
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2004-4-14
收藏
得分:0 

honestly, when i looked at the question, i thought the anwer must be only B, but i was totally wrong!!!this is the first time i knew that shfiting 32 bits for int doesnt change its value at all, it was amazing~!!!

if you got trouble with a problem, write a program to test, it s gonna help you a lot!

public class TestNeg{ public static void main(String[] args){ int a = -1; a = a >>> 8;

byte b = -1; b = (byte)(b>>>5);

int c = -1; c = c >>> 5;

int d = -1; d = d >>>32; System.out.println(a+" "+b+" "+c+" "+d); } }


Anstey. Cheers. I love CAPPUCCINO~~
2004-08-11 16:40
tqtbj
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2004-8-1
收藏
得分:0 
学到东东了,我超顶!!!
2004-08-17 18:45
快速回复:一个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019098 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved