了解Java Inclusive or运算符(|)

了解Java Inclusive or运算符(|),java,byte,long-integer,Java,Byte,Long Integer,我试图解决这个问题:我有一个字节值(1字节),我需要将这个值转换成长值(8字节)。但是我想要的是用我以前的字节值替换long变量的第一个字节 例如: My Byte Value: 11001101 My Long Value: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 What I want: 00000000 00000000 00000000 00000000 00000000 000000

我试图解决这个问题:我有一个字节值(1字节),我需要将这个值转换成值(8字节)。但是我想要的是用我以前的字节值替换long变量的第一个字节

例如:

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
就这么简单

我正在尝试这样做(示例):

但我得到了结果——112!在我的理解中,java位或运算符应该对long值的第一个字节和字节值执行“or”。相反,or运算符将字节值的2补码表示形式复制到长值中,这不是我想要的

在这种情况下,我期望的结果是144,因为-112是10010000,考虑无符号值时是144


希望你能理解我。谢谢

Java在进行数学运算之前,将带符号的
字节
提升为带符号的
,该符号扩展字节

要修复它,可以执行以下操作:

l = l | (0xFF & (long)b))


(这是因为
0xFF
是一个正的
int
值。如果它是
字节
,它也会得到一个负长的符号扩展。)(在这里将b转换为
int
和将b转换为

Java在进行数学运算之前,将带符号的
字节
提升为带符号的
,该符号扩展字节

要修复它,可以执行以下操作:

l = l | (0xFF & (long)b))


(这是因为
0xFF
是一个正的
int
值。如果它是
字节
,它也会得到一个负长的符号扩展。)(在这里将b转换为
int
和将b转换为
一样有效)

这里发生的情况是
b
转换为
,这是通过符号扩展完成的:最高有效位(1)被重复,因此7
11111111
字节被用作填充。这里的补救办法是使用位元和(<代码>和代码>):明确地只考虑所得值中的8个最低有效位:


这里发生的是将
b
转换为
long
,这是通过符号扩展完成的:最高有效位(1)被重复,因此7
11111111
字节被用作填充。这里的补救办法是使用位元和(<代码>和代码>):明确地只考虑所得值中的8个最低有效位:


Java中大多数运算符的参数首先进行类型提升;您的代码相当于
l=l |(long)b。Java中大多数运算符的参数首先进行类型提升;您的代码相当于
l=l |(long)b
l |= 0xFF & (long)b
l = l | ((long)b & 0xff);