Java或操作员疯了

Java或操作员疯了,java,operator-keyword,Java,Operator Keyword,冒着接下来几天感到羞耻的风险。。。请给我解释一下。 我需要对带字节的整数做算术运算 int a = 0x0100; byte b = (byte)0xff; int c = a | b; 我希望c是0x100 | 0xff=0x1ff=511 但是它是0xffffffff=-1 为什么?b是-1。 当您执行a | b时,b被提升为一个int,它仍然是-1 因此,a | b的评估就好像a |-1一样 final int a=0x0100; 最终整数b=0xFF; 最终整数c=a | b; 我

冒着接下来几天感到羞耻的风险。。。请给我解释一下。
我需要对带字节的整数做算术运算

int a = 0x0100;
byte b = (byte)0xff;
int c = a | b;
我希望c是
0x100 | 0xff=0x1ff=511

但是它是
0xffffffff=-1

为什么?

b
-1
。 当您执行
a | b
时,
b
被提升为一个int,它仍然是
-1

因此,
a | b
的评估就好像
a |-1
一样

final int a=0x0100;
最终整数b=0xFF;
最终整数c=a | b;
我不知道你到底想做什么,但是

How could I accomplish adding 8 bits to the end of a int value in simple steps?
int-appenddummynes(最终int值,最终int大小){
返回(值>>(Integer.SIZE-SIZE));
}
整数remarkDummyOnes(最终整数值、最终整数大小){
返回值|(-1>>>(Integer.SIZE-SIZE));
}
这项工作:

int c = a | (b & 0xff);
在代码中

int c = a | b;
字节b加宽为int并保留值(-1表示符号int中的该值)。 int中的这个值是0xFFFFFF,所以在0x0100 | 0xFFffFFff之后得到0xFFFFFF


正如Jin Kwon的回答中所述,您应该在当前情况下使用ints。

中解释了遵守行为的原因。但是请注意,有一个简单的解决方案(除了其他答案中提到的
(b&0xFF)
)之外):Java8添加了一些方便的方法来处理无符号值。所以你可以简单的做

    int c = a | Byte.toUnsignedInt(b);

为了你的代码,我用了这个。代码变得疯狂的原因有:

您使用的是1字节(8位)的整数(int)数据类型,但处理的是2字节(16位)的数据。在这种情况下,MSB(第8位)被视为符号位,0表示(-ve),1表示(+ve)

事实上,OR操作员并没有发疯,这是你的代码。您可以使用如下类似的实现,以使代码充分发挥作用:

import java.io.*;
import java.util.*;

class Lesson7{
    public static void main(String args[]){
        int a = 0x01;
        byte b = (byte)0x00;
        int c = a | b;
        System.out.println(c);
    }
}

我已经测试过这个:

int a = 0x100;
int b = 0xff;
int c = a|b;
System.out.println(c);

提示:尝试
intc=b
并查看结果,甚至不使用
|
运算符。如果您对此感到惊讶,请在JLS中查找数字促销。此外,在进一步操作之前,只需打印
b
。OMG!如果视为字节,则b为-1。这很好,但我不知道这些值会扩展为数字!嘿,但这纯粹是胡说八道!我怎样才能在简单的步骤中完成向一个int值的末尾添加8位呢?这不是有很多问题吗?我想找几个好吧我只找到一个不完全一样的。。。哦,好吧。我可以发誓我以前见过这个though@FelixDombek当然可以。您只需执行
inti=b&0xFF
。好的,我不知道这件事。如果我有一个字节数组中的字节,我需要把它转换成一个int,而所有的东西都是f,这对我来说是相当令人不安的。。。up:-(好的,但据我所知,至少我可以让它工作。谢谢!问题是代码中的a和c没有不同的位
int a = 0x100;
int b = 0xff;
int c = a|b;
System.out.println(c);