java 无符号右移

      最近在看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,这样下面算起来就正确多了,以后多注意。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值