我处理从CCS转换浮点数,它不遵循IEEE标准(而不是符号位,指数,尾数,它们使用指数,符号位,尾数);我使用>>>
运算符遇到了一些奇怪的行为。
给定的
byte byte1=(byte)0x8A; //10001010
byte byte2=(byte)(byte1>>>1); //11000101
由于>>>
指定它会插入0
,为什么我会收到1
?
我可以对此进行编码,只需手动翻转,但我不想发现它是特定于平台的。
答案 0 :(得分:2)
在java中,字节在转换操作之前自动转换为int。在学术上,你所做的相当于:
byte byte2=(byte)(((int)byte1)>>>1);
当然,强制转换为int符号。如果您将结果保留为整数,则会看到(当时)期望值0x7FFFFFC5。
要解决这个问题,只需将第8位屏蔽掉即可。
byte byte2 = (byte) (byte1 >>> 1 & 0x7F);
这种行为是不是很明智和预期,而且不是很棒吗?
答案 1 :(得分:1)
不要使用字节,坚持使用int。但是,运行以下代码:
int int1 = 0x8A;
System.out.println(formatBinary(int1));
int int2 = int1 >>> 1;
System.out.println(formatBinary(int2));
获取此输出(使用名为formatBinary的格式化打印方法,这是无关紧要的):
8a: 10001010
45: 01000101
答案 2 :(得分:0)
你正在使用整数,而不是字节。 int
值必须比您移入的第8位高1位。