为了账号安全,请及时绑定邮箱和手机立即绑定

FileInputStream

代码有问题,求解啊,不知道为什么出错http://img1.sycdn.imooc.com//583c05f00001b22911360725.jpg

正在回答

4 回答

凌晨来回答问题。

首先我们要弄明白,对于一个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,比较容易理解。

2 回复 有任何疑惑可以回复我~
#1

指尖繁华 提问者

非常感谢!
2016-12-20 回复 有任何疑惑可以回复我~
#2

未卜先知

“注意这里0xff 是4个字节的int类型这里不对把”,0xff应该还是一个字节,只不过运算的时候会把参与运算的转成int型
2016-12-29 回复 有任何疑惑可以回复我~
#3

未卜先知

这里是我错了 0xff确实是整型
2016-12-29 回复 有任何疑惑可以回复我~
#4

i不系之舟i

非常感谢
2017-08-06 回复 有任何疑惑可以回复我~
查看1条回复

if判定语句改为((buf&oxff)<=oxf);之后输出都是两位,这个不知原因,跪求求大神解惑 !!

0 回复 有任何疑惑可以回复我~

还有,int b=in.read()则没有以上问题;


0 回复 有任何疑惑可以回复我~

或许不是错,但是为啥有三个数字一组的,这个不太懂。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

FileInputStream

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信