如何在Java中存储(一个数组)无符号字节以对其进行位操作?

如何在Java中存储(一个数组)无符号字节以对其进行位操作?,java,Java,我需要在Java中存储(一个数组)无符号字节,以便对它们进行位操作。 我想做标准的位操作。移位((sVal>>8)和0xff)、或|和&,以及比较。还有像w |=0xff 我如何储存它们 字节b=0x96//值是150 我得到一个编译错误:类型不匹配:无法从int转换为byte 所以我投了 字节b=(强制转换)0x96 现在我看到值已更改为-106 如果我存储为char,则会将其提升为2个字节 我应该如何在Java中将该值存储为无符号字节,以便对其进行位操作 使用int是否会出现问题?Java中

我需要在Java中存储(一个数组)无符号字节,以便对它们进行位操作。 我想做标准的位操作。移位
((sVal>>8)和0xff)、或|和&,以及比较。还有像
w |=0xff
我如何储存它们

字节b=0x96//值是150

我得到一个编译错误:类型不匹配:无法从int转换为byte

所以我投了

字节b=(强制转换)0x96

现在我看到值已更改为-106

如果我存储为char,则会将其提升为2个字节

我应该如何在Java中将该值存储为无符号字节,以便对其进行位操作


使用int是否会出现问题?

Java中没有未签名的原始数据类型--字节是有符号的。您需要找出其他表示数据的方法,具体取决于您想要做什么

编辑:

人们给了你很多建议和解释,而你却没有对你的情况做太多的解释(“很多建议和解释都很快”没有帮助)。但我注意到了你原来的帖子中的其他内容

你说

字节b=(强制转换)0x96

现在我看到值已更改为-106

我想知道你是否理解字节的值根本没有改变。字节仍然是十六进制96,如果以十六进制打印出来,您可以看到。-106只是十六进制96表示的十进制数


如果您只想进行位操作,那么仍然可以将其全部存储为字节。只有当您还需要算术运算(加法、减法、乘法、除法、大于、小于)时,您才需要担心字节的有符号性质。

如果您不进行涉及符号的算术运算,则使用位运算(无符号右移除外)是没有问题的

是的,转换为char或int会扩展符号,但您可以执行以下操作:

byte b = (byte)0x96;
int n = 0xFF & b; // Again 0..255
(也许有人应该警告,试图用字符将字节存储在字符串中是一种涉及编码转换的滥用。)


顺便说一下,这些类有许多有趣的位操作。类位集也是一个有趣的游乐场。

您可以对有符号字节进行位操作——它们产生与您预期相同的结果。你必须注意的一件事是
>
;如果有符号字节为负数,这将用1填充最左边的位,但如果使用
>
(三个
符号),它将始终用0填充最左边的位,这实际上将它视为无符号字节,即使它是有符号的

如果需要字节的整数值,并且需要0到255之间的值:

int value = ((int)yourByte) & 0xFF;
或者,在Java8中,您可以使用

[事实上,强制转换是不必要的,因为在应用
&
之前,
yourByte
0xFF
将自动升级到
int
。但是,如果不查找该规则,我永远不会记住该规则,因此显式强制转换对我很有帮助。]


如果要对两个字节(或一个字节和一个整数文本)进行有序比较,并将它们视为无符号,可以使用上述方法之一将它们转换为
int
,并比较
int
s。

可以对字节使用二进制操作,而不受任何限制,只需注意右移,取决于你愿意实现什么。使用
Integer.toBinaryString(int i)
您可以看到正在发生的事情,尽管这不是最好的表示:

public static void main(String[] args) {
        byte b1 = (byte) 0x96;
        int i1 = b1 & 0xFF;
        System.out.println(Integer.toBinaryString(i1));
        byte b2 = (byte) (b1 << 1);
        int i2 = b2 & 0xFF;
        System.out.println(Integer.toBinaryString(i2));
            System.out.println(Integer.toBinaryString(i1 & i2));
    }
publicstaticvoidmain(字符串[]args){
字节b1=(字节)0x96;
int i1=b1&0xFF;
System.out.println(Integer.toBinaryString(i1));

字节b2=(字节)(b1)好吧,你可以在整数上做这些运算,然后屏蔽掉上面的3级字节。我不知道它们有多少,速度有多快,但这会允许移位,等等。你只需要处理签名部分,在Java中,我不知道如何解决它。如果是我,我会定义我想要的操作,并编写能够实现这些操作的方法对字节中的8位整数进行这些操作,这将允许我确保我首先处理的不是负整数,等等,而不会使上层代码太乱。这是图像图形,必须快速,而且有很多。实际上,
char
是无符号的。存储可以是任何东西,since您可以对任何类型的数字进行位操作。这不重要,因为在一天结束时仍然是0和1(只需忽略实际值并关注0和1的位置),如果您想了解结果,只需调用tobinarysting()方法,或者实现您自己的getBit()和setBit()方法非常简单。
char
是无符号的,如果你把它当作一个整数来处理,它会像任何其他整数一样。当然,它是16位,所以在某些情况下你必须屏蔽高半位。或者你可以使用
short
int
而不做任何导致高阶位被设置的事情。你需要理解二进制数据表示法,0x96在有符号字节中是-106。@HotLicks我确实理解。但我也要做比较。像
w |=~0xff;
对不起,我不清楚,我要做右移,比较也可以。
=~0xff
会有问题。使用简短的方法总是重置高字节,
&=0xFF
。因此可能short+reset是最好的选择。那么位集呢?特别是正如您提到的字节数组。为每个字节设置位集实例在空间上似乎效率不高。那么使用int+reset呢?int+reset也可以,事实上JVM使用
int
来处理较小的值。比特集更像是一个字节数组的替代品。对不起,我不清楚,我要做ri