问题
I'm trying to solve this problem: I have a byte value (1 byte) and I need to transform this value into a long value (8 bytes). But what I want is just replace the first byte of the long variable with the byte value I had before.
A example:
My Byte Value: 11001101
My Long Value: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
What I want: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11001101
Simple as that!
I'm trying to do this (example):
byte b = -112;
long l = 0;
l = l | b;
System.out.println(l);
But I get the result -112! In my understanding, the java bit or operator should do an "or" with the first byte of the long value and the byte value. Instead, the or operator is copying the 2-complement representation of the byte value into the long value, and this is not what I want.
The result I was expecting in that case was 144, since -112 is 10010000, which is 144 when considering a unsigned value.
Hope you understand me. Thanks!
回答1:
What happens here is that b
is cast to long
, and this is done via sign extension: the most-significant bit (1) is repeated, hence 7 11111111
bytes are used as padding. The remedy here is to explicitly consider only the 8 least-significant bits in the resulting value, using a bitwise and (&
):
l = l | ((long)b & 0xff);
回答2:
Java promotes the signed byte
to a signed long
before doing math operations, and that sign extends the byte.
To fix it, you can do this:
l = l | (0xFF & (long)b))
or
l |= 0xFF & (long)b
(This works because 0xFF
is a positive int
value. If it was a byte
, it'd also get sign extended to a negative long.) (Casting b to an int
here would work as well as casting to a long
.)
来源:https://stackoverflow.com/questions/26518253/understanding-java-inclusive-or-operator