Eu tenho o seguinte código Java:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
O resultado é 254 quando impresso, mas não tenho ideia de como esse código funciona. Se o &
operador for simplesmente bit a bit, por que ele não resulta em um byte e, em vez disso, em um inteiro?
java
integer
byte
bitwise-and
Dagronlund
fonte
fonte
byte value = (byte) 0xfe;
Respostas:
Ele define
result
o valor (sem sinal) resultante de colocar os 8 bits devalue
nos 8 bits mais baixos deresult
.A razão pela qual algo assim é necessário é que
byte
é um tipo assinado em Java. Se você acabou de escrever:então
result
terminaria com o valor emff ff ff fe
vez de00 00 00 fe
. Outra sutileza é que o&
é definido para operar apenas nosint
valores 1 , então o que acontece é:value
é promovido aint
(ff ff ff fe
).0xff
é umint
literal (00 00 00 ff
).&
é aplicado para produzir o valor desejado pararesult
.(A questão é que a conversão
int
ocorre antes de o&
operador ser aplicado.)1 Bem, não exatamente. O
&
operador também trabalha comlong
valores, se um dos operandos for umlong
. Mas nãobyte
. Consulte a Especificação da linguagem Java, seções 15.22.1 e 5.6.2 .fonte
0x
(ou0X
) diz ao Java que o literal inteiro que se segue deve ser interpretado como hex (base 16). Java também oferece suporte a um0
prefixo simples para literais octais e um prefixo0b
(ou0B
) para literais binários. Consulte a Especificação da linguagem Java para obter mais informações sobre literais inteiros.0x
ou0b
por si só (sem nenhum dígito após) é uma sintaxe ilegal em Java.fe
em 8 bits, o complemento de dois corresponde ao valor decimal -2. Para preservar o valor,Integer.valueOf(byte)
seria necessário produzirff ff ff fe
(−2 em 32 bits, complemento de dois), não00 00 00 fe
(valor decimal 254). Essa transformação (de umbyte
valorfe
para umint
valorff ff ff fe
) é conhecida como extensão de sinal e faz parte da especificação da linguagem Java. O objetivo devalue & 0xff
é desfazer a extensão do sinal (ou seja, simular a extensão zero, algo que o Java não possui).De http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
O literal hexadecimal 0xFF é um int igual (255). Java representa int como 32 bits. É parecido com isto em binário:
Quando você faz um AND bit a bit com este valor (255) em qualquer número, ele irá mascarar (fazer ZEROs) todos, exceto os 8 bits mais baixos do número (será como está).
& é algo como%, mas não realmente .
E por que 0xff? isso em ((potência de 2) - 1). Todos ((potência de 2) - 1) (por exemplo, 7, 255 ...) se comportarão algo como% operador.
Então,
em binário, 0 é, todos zeros, e 255 se parece com isto:
E -1 é assim
Quando você faz um AND bit a bit de 0xFF e qualquer valor de 0 a 255, o resultado é exatamente o mesmo que o valor. E se qualquer valor superior a 255, o resultado ficará entre 0-255.
No entanto, se você:
você pega
00000000 00000000 00000000 11111111
, que NÃO é igual ao valor original de -1 (11111111
é 255 em decimal).Verifique se qualquer bit em particular está definido (1) ou não (0), então
Defina (1) um bit particular
ReSet (0) um bit particular
XOR
Observe que, se você executar a operação XOR duas vezes, o resultado será o mesmo valor.
Mais uma lógica com XOR é
O acimaéútil para trocar duas variáveis sem temp como abaixo
OU
fonte
Ajuda a reduzir muitos códigos. Ocasionalmente, é usado em valores RGB que consistem em 8 bits.
onde 0xff significa 24 (0's) e 8 (1's) como
00000000 00000000 00000000 11111111
É visto mais em casos como ao tentar transformar valores de cores de um formato especial para valores RGB padrão (que tem 8 bits).
Ótima Explicação Veja aqui
fonte
No sistema de formato de 32 bits, o valor hexadecimal
0xff
representa00000000000000000000000011111111
que está255(15*16^1+15*16^0)
em decimal. e o operador bit a bit & mascara os mesmos 8 bits mais à direita do primeiro operando.fonte