最近在看Java的一些基本的知识,今天在看关于运算符和类型转换的一个问题的时候,怎么算都与答案不一样,反复检查也没有发现自己的算法有什么问题,最后看了解释才发现原来是这个样子,记录一下,以免以后发生同样的错误。
先把题目贴出来:
public class MultByTwo {
/**
* Creates a new instance of <code>MultByTwo</code>.
*/
public MultByTwo() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
char hex[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
byte b=(byte)0Xf1;
byte c=(byte)(b>>4);
byte d=(byte)(b>>>4);
byte e=(byte)((b&0Xff)>>4);
System.out.println("b=0X"+hex[(b>>4)&0X0f]+hex[b&0X0f]);
System.out.println("b>>4=0X"+hex[(c>>4)&0X0f]+hex[c&0X0f]);
System.out.println("b>>>4=0X"+hex[(d>>4)&0X0f]+hex[d&0X0f]);
System.out.println("(b&0Xff)>>4=0X"+hex[(e>>4)&0X0f]+hex[e&0X0f]);
}
}
b=0Xf1
b>>4=0Xff
b>>>4=0Xff
(b&0Xff)>>4=0X0f
前两个答案没有什么问题,但是第三个、第四个却跟我的不太一样,可是自己的算法明明没有问题啊,开始怀疑是答案错了,因此写了程序跑了一下,发现答案没错,是我的问题,但是到底是哪有问题呢?
最后发现原来当处理无符号右移运算符>>>对byte型值进行处理的时候,实际上不是对byte型值直接操作,而是将其扩大到int型后再处理。
b转换为16进制的后8位为:b=11110001,将其扩大到int型后,前面的为数全有1补齐,因此当把b无符号右移4位时,后8位全部是1,因此d=1111111,这样下面算起来就正确多了,以后多注意。