什么是价值与价值;0xff在Java中做什么?
我有以下Java代码:什么是价值与价值;0xff在Java中做什么?,java,integer,byte,bitwise-and,Java,Integer,Byte,Bitwise And,我有以下Java代码: byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned) int result = value & 0xff; 打印时的结果是254,但我不知道这段代码是如何工作的。如果&运算符只是按位的,那么为什么它不产生一个字节而不是一个整数?它将结果设置为(无符号)值,该值是将值的8位放在结果的最低8位后得到的 这样做之所以必要,是因为byte在Java中是一种有符号类型。如果你只是写: int
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
打印时的结果是254,但我不知道这段代码是如何工作的。如果
&
运算符只是按位的,那么为什么它不产生一个字节而不是一个整数?它将结果
设置为(无符号)值,该值是将值的8位
放在结果
的最低8位后得到的
这样做之所以必要,是因为byte
在Java中是一种有符号类型。如果你只是写:
int result = value;
然后,result
将以值ff ff fe
而不是00fe
结束。另一个微妙之处是&
被定义为仅对int
值1进行操作,因此发生的情况是:
值
被提升为int
(ff ff ff fe
)0xff
是一个int
文本(00ff
)&
为结果
生成所需的值&
运算符之前,会发生到int
的转换。)
嗯,不完全是。如果任一操作数为长
,则&
运算符也处理长
值。但不是在字节上。请参阅Java语言规范的章节和
十六进制文字0xFF是一个相等的整数(255)。Java将int表示为32位。它在二进制中看起来像这样:
00000000 00000000 00000000 11111111
当您按位执行此操作时,在任何数字上使用此值(255),它将屏蔽(置零)除数字的最低8位之外的所有位(将保持原样)
&类似于%,但不是
为什么是0xff?这是在((2的幂)-1)中。
所有((2的幂)-1)(例如7255…)的行为类似于%operator
然后
在二进制中,0为,全部为零,255如下所示:
00000000 00000000 00000000 11111111
和-1看起来像这样
11111111 11111111 11111111 11111111
当您对0xFF和0到255之间的任何值进行位AND运算时,结果与该值完全相同。如果任何值高于255,结果仍将在0-255范围内
但是,如果您这样做:
-1 & 0xFF
你得到
00000000 00000000 00000000 11111111
,它不等于原始值-1(11111111
十进制为255)
多几位操作:(与问题无关)
使用XOR的另一个逻辑是
if A (XOR) B == C (salt)
then C (XOR) B == A
C (XOR) A == B
上面的内容对于交换两个没有临时变量的变量很有用,如下所示
a = a ^ b; b = a ^ b; a = a ^ b;
或
它有助于减少大量代码。它偶尔用于由8位组成的RGB值
其中0xff表示24(0)和8(1)类似00000000000000000000000000111111
它有效地屏蔽了变量,因此它只保留最后8位中的值,而忽略所有其余的位
在尝试将颜色值从特殊格式转换为标准RGB值(8位长)的情况下最常见
在32位格式系统中,十六进制值0xff
表示00000000000000000000000011111111
,即255(15*16^1+15*16^0)
。并且按位&运算符屏蔽与第一个操作数相同的8个最右边的位 还有look@Bit操作,在这个符号中x是什么意思?x不是一个数字或十六进制数?@KazRodgers-前缀0x
(或0x
)告诉Java后面的整数文本应该解释为十六进制(以16为基数)。Java还支持八进制文字的裸0
前缀和二进制文字的0b
(或0b
)前缀。有关整数文本的详细信息,请参阅。下面的文本是什么?例如,如果我有0x3fa。3fa是被翻译成文字数字的部分,0x指出“这是一个十六进制数字”@泰德霍普?@KazRodgers-没错。请注意,0x
或0b
本身(后面没有任何数字)在Java中是非法语法。@DmitryMinkovsky-八位中的十六进制位模式fe
,二的补码对应于十进制值−2.要保留该值,Integer.valueOf(byte)
需要生成ff ff-fe
(−2在32位,2的补码),而不是00FE
(十进制值254)。这种转换(从byte
valuefe
到int
valueff-ff-fe
)被称为Java语言规范,是Java语言规范的一部分。value&0xff
的目的是撤销符号扩展(即,模拟零扩展,Java没有)。您能再解释一下吗?我将代码复制到Eclipse。它警告我“类型不匹配:无法从int转换为byte”。如果更改为int值=0xfe@本成应为字节值=(字节)0xfe代码>
int thirdBitTobeChecked = 1 << 2 (...0000100)
int onWhichThisHasTobeTested = 5 (.......101)
int isBitSet = onWhichThisHasTobeTested & thirdBitTobeChecked;
if(isBitSet > 0) {
//Third Bit is set to 1
}
int thirdBitTobeSet = 1 << 2 (...0000100)
int onWhichThisHasTobeSet = 2 (.......010)
onWhichThisHasTobeSet |= thirdBitTobeSet;
int thirdBitTobeReSet = ~(1 << 2) ; //(...1111011)
int onWhichThisHasTobeReSet = 6 ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;
byte toBeEncrypted = 0010 0110
byte salt = 0100 1011
byte encryptedVal = toBeEncrypted ^ salt == 0110 1101
byte decryptedVal = encryptedVal ^ salt == 0010 0110 == toBeEncrypted :)
if A (XOR) B == C (salt)
then C (XOR) B == A
C (XOR) A == B
a = a ^ b; b = a ^ b; a = a ^ b;
a ^= b ^= a ^= b;