0xff在Java中做什么?

0xff在Java中做什么?,java,file-io,bit-manipulation,operators,bit,Java,File Io,Bit Manipulation,Operators,Bit,从Inputstream中,我读取前4个字节,并将它们打包以获得 本例中的一些信息是流的大小/长度 为此,我使用从另一个项目复制的代码示例1 示例1:使用字节数组,其中值从InputStream读取到长度为4的以_buf[]命名的数组中,该数组的值为{0,0,12,26} 例1 int size = (((in_buf[0] & 0xff) << 24) | ((in_buf[1] & 0xff) << 16) | ((in_buf

从Inputstream中,我读取前4个字节,并将它们打包以获得 本例中的一些信息是流的大小/长度

为此,我使用从另一个项目复制的代码示例1

示例1:使用字节数组,其中值从InputStream读取到长度为4的以_buf[]命名的数组中,该数组的值为{0,0,12,26}

例1

int size = (((in_buf[0] & 0xff) << 24) | ((in_buf[1] & 0xff) << 16) |
            ((in_buf[2] & 0xff) << 8) | (in_buf[3] & 0xff)); // result its 3098
像这样的东西

是的,除了操作数经过并转换为int,所以技术上应该显示32位

为什么我们需要使用掩码&0xff

这就是我们将负字节视为正整数的原因,本质上就是这样。它对非负字节没有任何作用,但对于负字节,比如-1:

当由于数字提升而转换为int时,它将被符号扩展到32位。也就是说,符号将保持负值。基本上这意味着如果这个数字是负数,我们就用1代替0。因此-1变成:

现在如果你使用 像这样的东西

是的,除了操作数经过并转换为int,所以技术上应该显示32位

为什么我们需要使用掩码&0xff

这就是我们将负字节视为正整数的原因,本质上就是这样。它对非负字节没有任何作用,但对于负字节,比如-1:

当由于数字提升而转换为int时,它将被符号扩展到32位。也就是说,符号将保持负值。基本上这意味着如果这个数字是负数,我们就用1代替0。因此-1变成:


现在,如果使用,它将强制将值转换为8位字节

由于Java没有无符号类型,字节值0xFF被解释为-1,并且由于Java的性质,它将被提升为32位int,即0xFFFF

位掩码用于丢弃负值的额外位,以便在使用或按位运算符|时不会覆盖这些位

下面是一个字节值为255的示例,尽管解释为-1并提升为int


它将强制将值转换为8位字节

由于Java没有无符号类型,字节值0xFF被解释为-1,并且由于Java的性质,它将被提升为32位int,即0xFFFF

位掩码用于丢弃负值的额外位,以便在使用或按位运算符|时不会覆盖这些位

下面是一个字节值为255的示例,尽管解释为-1并提升为int


示例1中显示的代码采用数组的前四个值,该数组可能包含您所描述的输入流或其值。它将它们排列成单个变量,可能是一个足够宽的无符号整数

根据您未指定的协议,它这样做是为了得到前四个值的语义含义

那么,为什么要采用这种迂回的方式,使用这些操作符呢

使用&0xff可确保仅使用较低的8位。 这是多余的,即不需要的,以防您可以依赖数组中来自字节的值,因此仅包含不超过位7的值。没有任何更高的位值256、512。。。这些都考虑到了。如果您不信任从流到数组中的单个字节的检索,那么这是有意义的。 然而,正如哈罗德在评论中善意地指出的那样,在java中

&0xff在Java中不是冗余的,因为byte是有符号类型,因此在转换为int时符号会扩展,需要删除符号的额外副本。若字节是无符号的,那个么它将保存很多这样的代码


示例1中所示代码的使用取数组的前四个值,该数组可能包含您所描述的输入流或其值。它将它们排列成单个变量,可能是一个足够宽的无符号整数

根据您未指定的协议,它这样做是为了得到前四个值的语义含义

那么,为什么要采用这种迂回的方式,使用这些操作符呢

使用&0xff可确保仅使用较低的8位。 这是多余的,即不需要的,以防您可以依赖数组中来自字节的值,因此仅包含不超过位7的值。没有任何更高的位值256、512。。。这些都考虑到了。如果您不信任从流到数组中的单个字节的检索,那么这是有意义的。 然而,正如哈罗德在评论中善意地指出的那样,在java中

&0xff在Java中不是冗余的,因为byte是有符号类型,因此在转换为int时符号会扩展,需要删除符号的额外副本。若字节是无符号的,那个么它将保存很多这样的代码


使用这些是二进制操作

到底发生了什么

&0xFF基本上意味着,你选择洛杉矶 st字节

二进制和&意味着,只有当两个数字中的1位于同一位置0时,结果位置上的值才为1,否则为0

还有一个例子:

  0000 0001 0000 1100 (268)
& 0000 0000 1111 1111 (0xff)
  -------------------
  0000 0000 0000 1100 (12)
12岁会怎么样

  0000 0000 0000 1100 (12)
& 0000 0000 1111 1111 (0xff)
  -------------------
  0000 0000 0000 1100 (12)
班次:

左移位只是将位推到左边

  0000 0000 0000 1100 (12)
<< 8
  -------------------
  0000 1100 0000 0000 (3072)
为什么我们需要使用掩码&0xff

在这种情况下,你不需要。但是,如果您使用较大的数字或负数,则可能需要使用掩码。另外,你要确保没有多余的凌乱部分

将其与或:

是的,基本上是加法,但只有在这种情况下。实际发生的情况是将使用&0xFF创建的字节彼此相邻以创建一个数字。这就是为什么要用8的倍数移位——每个字节都有自己的大小为8的位置

假设你有X,Y,Z,W字节。
那么X这些是二进制运算

到底发生了什么

&0xFF基本上意味着取最后一个字节

二进制和&意味着,只有当两个数字中的1位于同一位置0时,结果位置上的值才为1,否则为0

还有一个例子:

  0000 0001 0000 1100 (268)
& 0000 0000 1111 1111 (0xff)
  -------------------
  0000 0000 0000 1100 (12)
12岁会怎么样

  0000 0000 0000 1100 (12)
& 0000 0000 1111 1111 (0xff)
  -------------------
  0000 0000 0000 1100 (12)
班次:

左移位只是将位推到左边

  0000 0000 0000 1100 (12)
<< 8
  -------------------
  0000 1100 0000 0000 (3072)
为什么我们需要使用掩码&0xff

在这种情况下,你不需要。但是,如果您使用较大的数字或负数,则可能需要使用掩码。另外,你要确保没有多余的凌乱部分

将其与或:

是的,基本上是加法,但只有在这种情况下。实际发生的情况是将使用&0xFF创建的字节彼此相邻以创建一个数字。这就是为什么要用8的倍数移位——每个字节都有自己的大小为8的位置

假设你有X,Y,Z,W字节。
然后X@harold这是多余的。。。如果您可以依赖这些值。。。仅包含不超过第7位的值。这是完整的报价。我认为这与你提到的并不矛盾。我想你的意思是我应该换成不那么复杂的句子结构?@harold我选择使用你的输入,给予赞扬,希望你不介意。@harold这是多余的。。。如果您可以依赖这些值。。。仅包含不超过第7位的值。这是完整的报价。我认为这与你提到的并不矛盾。我想你的意思是我应该换成不那么复杂的句子结构?@harold我选择使用你的输入,给予信任,希望你不介意。谢谢,我在这里学到了更多关于数字升级的知识。谢谢,我在这里学到了更多关于数字升级的知识。很好,二进制操作示例让eas理解了!伟大的二进制操作示例使eas易于理解!
0000 0000 0000 0000 0000 0000 1111 1111
0000 0000 0000 0000 1111 1111 0000 0000
  1111 1111 1111 1111 1111 1111 1111 (-1, but was originally an unsigned byte of 255)
& 0000 0000 0000 0000 0000 1111 1111 (0xff)
  ----------------------------------
  0000 0000 0000 0000 0000 1111 1111 (an int with the original value of 255)
  0000 0001 0000 1100 (268)
& 0000 0000 1111 1111 (0xff)
  -------------------
  0000 0000 0000 1100 (12)
  0000 0000 0000 1100 (12)
& 0000 0000 1111 1111 (0xff)
  -------------------
  0000 0000 0000 1100 (12)
  0000 0000 0000 1100 (12)
<< 8
  -------------------
  0000 1100 0000 0000 (3072)
  0000 0000 0001 1010 (26)
& 0000 0000 1111 1111 (0xff)
  -------------------
  0000 0000 0001 1010 (26)