当前位置: 代码迷 >> Java相关 >> 一个问题
  详细解决方案

一个问题

热度:348   发布时间:2004-08-10 13:52:00.0
一个问题

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  

----------------解决方案--------------------------------------------------------
我也不会

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

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

本题只能解答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进制的吧?


----------------解决方案--------------------------------------------------------

楼主的题目答案应该是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)


----------------解决方案--------------------------------------------------------
解答一点点还错了

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

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


----------------解决方案--------------------------------------------------------

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

首先,答案错了,是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编辑过]


----------------解决方案--------------------------------------------------------

呵呵,顶!

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


----------------解决方案--------------------------------------------------------
小菜鸟

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

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

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

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


----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------

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); } }


----------------解决方案--------------------------------------------------------
学到东东了,我超顶!!!
----------------解决方案--------------------------------------------------------
  相关解决方案