FileInputStream
代码有问题,求解啊,不知道为什么出错
代码有问题,求解啊,不知道为什么出错
2016-11-28
凌晨来回答问题。
首先我们要弄明白,对于一个buf[i], 我们在什么情况下需要在输出之前补0,什么时候不需要补0.答案很清楚,如果它的高四位都是0,那么我们需要补,否则不需要。那么问题来了,怎么判断呢?
老师的代码是用buf[i] <= 0xf,可是代码结果不正确,会出现错误补0,也就是三个数字一起的情况。如果buf[i] == 0xff, 那么按程序是需要补0,因为作为一个byte,0xff实际上等于-1, 那么自然也小于0xf,因为0xf代表15.这就是出错的问题。
if判定语句改为((buf&oxff)<=oxf)之后,实际上结果就正确了。因为在Java中整数默认是int,也就是4个字节。因为有buf[i] & 0xff, 注意这里0xff 是4个字节的int类型,那么计算之前会把buf[i]自动进行类型转换,结果也是int类型,所以我们最终的到的结果是24位0加上原先的8位buf[i]。这时候的结果已经绝对是个正数,此时要判断buf[i]高4位是否有1,就看他和0xf的大小就行了。这里要设计一点补码的知识,我们还是以buf[i] == 0xff为例:
((buf&oxff)<=oxf)之后的结果是0x000000ff, 显然是大于0xf,所以没有补0.
实际上,我们也可以这么判断:buf[i] & 0xf0 == 0;这样的结果会保留buf[i]的高四位,其他位都是0,比较容易理解。
举报