Java和0xff的值是什么?

dag*_*und 91 java byte integer bitwise-and

我有以下Java代码:

byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
Run Code Online (Sandbox Code Playgroud)

打印时结果是254,但我不知道这段代码是如何工作的.如果&运算符只是按位,那么为什么它不会产生一个字节而是一个整数呢?

Ted*_*opp 159

它设置result为(无符号)值,将8位置value于最低8位result.

这样的事情是必要的,因为它byte是Java中的签名类型.如果你刚才写道:

int result = value;
Run Code Online (Sandbox Code Playgroud)

然后result最终得到的价值ff ff ff fe而不是00 00 00 fe.更进一步的细微之处在于,它&被定义为仅在int1上运行,因此会发生以下情况:

  1. value被提升为int(ff ff ff fe).
  2. 0xff是一个int文字(00 00 00 ff).
  3. &被施加到得到所希望的值result.

(该点是,转换int发生之前&施加操作者).

1 嗯,不太好.该&运营商工作的long价值以及,如果操作数是一个long.但不是byte.请参阅Java语言规范,第15.22.1节和第5.6.2节.

  • @KazRodgers - "0x"(或"0X")前缀告诉Java,后面的整数文字应该被解释为hex(base 16).Java还支持八进制文字的简单"0"前缀和二进制文字的"0b"(或"0B")前缀.有关整数文字的更多信息,请参阅[Java语言规范](http://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.1). (3认同)
  • @DmitryMinkovsky - 8 位二进制补码中的十六进制位模式 `fe` 对应于十进制值 -2。为了保留值,`Integer.valueOf(byte)` 需要产生 `ff ff ff fe`(32 位中的 -2,二进制补码),而不是 `00 00 00 fe`(十进制值 254)。这种转换(从`byte`值`fe`到`int`值`ff ff ff fe`)被称为[符号扩展](https://en.wikipedia.org/wiki/Sign_extension)并且是一部分Java 语言规范。`value & 0xff` 的目的是撤销符号扩展(即模拟零扩展,这是Java 没有的)。 (2认同)

Kan*_*mar 48

来自http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff

十六进制文字0xFF是一个等于int(255).Java将int表示为32位.二进制看起来像这样:

00000000 00000000 00000000 11111111
Run Code Online (Sandbox Code Playgroud)

当您对任何数字使用此值(255)进行一点点明智的AND时,它将屏蔽(生成ZERO)除了数字的最低8位(将按原样).

... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101
Run Code Online (Sandbox Code Playgroud)

&是像%,但不是真的.

为什么是0xff?这个((2的幂) - 1).全部((2的幂) - 1)(例如7,255 ......)将表现得像%运算符.

然后
在二进制中,0是全零,255看起来像这样:

00000000 00000000 00000000 11111111
Run Code Online (Sandbox Code Playgroud)

-1看起来像这样

11111111 11111111 11111111 11111111
Run Code Online (Sandbox Code Playgroud)

当您执行0xFF的按位AND和0到255之间的任何值时,结果与值完全相同.如果任何高于255的值仍然结果将在0-255之内.

但是,如果你这样做:

-1 & 0xFF
Run Code Online (Sandbox Code Playgroud)

你得到

00000000 00000000 00000000 11111111,它不等于-1的原始值(11111111十进制为255).


几点操作:(与问题无关)

X >> 1 = X/2
X << 1 = 2X
Run Code Online (Sandbox Code Playgroud)

检查任何特定位是否设置(1)或不设置(0)

 int thirdBitTobeChecked =   1 << 2   (...0000100)
 int onWhichThisHasTobeTested = 5     (.......101)

 int isBitSet = onWhichThisHasTobeTested  & thirdBitTobeChecked;
 if(isBitSet > 0) {
  //Third Bit is set to 1 
 } 
Run Code Online (Sandbox Code Playgroud)

设置(1)特定位

 int thirdBitTobeSet =   1 << 2    (...0000100)
 int onWhichThisHasTobeSet = 2     (.......010)
 onWhichThisHasTobeSet |= thirdBitTobeSet;
Run Code Online (Sandbox Code Playgroud)

重新设置(0)特定位

int thirdBitTobeReSet =   ~(1 << 2)  ; //(...1111011)
int onWhichThisHasTobeReSet = 6      ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;
Run Code Online (Sandbox Code Playgroud)

XOR

请注意,如果执行两次XOR运算,将产生相同的值.

byte toBeEncrypted = 0010 0110
byte salt          = 0100 1011

byte encryptedVal  =  toBeEncrypted ^ salt == 0110 1101
byte decryptedVal  =  encryptedVal  ^ salt == 0010 0110 == toBeEncrypted :)
Run Code Online (Sandbox Code Playgroud)

XOR的另一个逻辑是

if     A (XOR) B == C (salt)
then   C (XOR) B == A
       C (XOR) A == B
Run Code Online (Sandbox Code Playgroud)

以上内容对于交换两个没有temp的变量非常有用,如下所示

a = a ^ b; b = a ^ b; a = a ^ b;
Run Code Online (Sandbox Code Playgroud)

要么

a ^= b ^= a ^= b;
Run Code Online (Sandbox Code Playgroud)


Xar*_*mer 5

它有助于减少大量代码。它偶尔用于由 8 位组成的 RGB 值。

其中 0xff 表示 24(0's ) 和 8(1's)00000000 00000000 00000000 11111111

它有效地屏蔽了变量,因此只留下最后 8 位的值,并忽略所有其余位

在尝试将颜色值从特殊格式转换为标准 RGB 值(8 位长)时,这种情况最常见。

很好的解释见这里