2011-02-16 23 views
22

Quiero obtener al menos 32 bits de un tipo de tipo largo, por lo que realizo la operación bit a bit "&" en el número con máscara de bits 0xFFFFFFFF, pero el resultado no es correcto, todavía contiene los otros bits.Bitwise "&" on a long?

por ejemplo:

long a = 0x1234567890ab; 
long b = (a & 0xffffffff); 

espero que el valor de b para ser 0x567890ab

pero en la práctica, sigue siendo 0x1234567890ab

+0

Como un programador C (25 años) estoy acostumbrado a utilizar variables sin firmar para evitar extensión de signo problemas, pero en este caso debería haber intentado agregar la L al final de mi litral. Estoy aprendiendo Java y probablemente caeré en algunos otros escollos: o) –

+1

Maldita buena pregunta. Me acabo de enterar de esto y la respuesta fue toda una sorpresa. ¿Esta falta en Java Puzzlers? :) –

Respuesta

44

Prueba esto:

long a = 0x1234567890ab; 
long b = (a & 0xffffffffL); 

0xffffffff es un literal del tipo int, para performi ng & con long se promociona al tipo long por sign extension, por lo tanto se convierte en 0xffffffffffffffff. Para evitar la extensión del signo, debe escribirlo como un literal del tipo long: 0xffffffffL.

+0

Lo descubrí justo después de publicar la pregunta: o) Gracias de todos modos. –

+2

¡Esta respuesta, y la pregunta original, me salvó de pasar mucho tiempo jugueteando con el depurador Eclipse! Gracias por la explicación y el enlace sobre _sign-extension_. – Axel

0

intente hacer un Y a nivel de bits con un valor largo con algunos ceros a la izquierda en lugar de un valor de 32 bits. ahora mismo básicamente no estás haciendo nada con el número.

3

¿El uso de 0xffffffffL hace alguna diferencia?

Creo que lo que sucede es que 0xffffffff se actualiza a una larga, y como tanto int como long están firmados, intenta mantener el mismo signo.

lo tanto, ya es 0xffffffff -1 como un int, que se convierte en -1 como mucho, o 0xffffffffffffffff