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
这样的题怎么做???帮忙解释一下,详细点哦~~
小菜鸟看见这个帖子本来想回复,结果看了半天。。。也不会
小菜鸟也有要多地方不明白。。。。
本题只能解答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进制的吧?
这个问题初学者确实不易掌握,我来详细的说一下,希望斑竹能列为精华,呵呵
首先,答案错了,是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编辑过]
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); } }