2010-03-05 12 views
5

Si tengo un número binario de 32 bits y quiero reemplazar el número binario inferior de 16 bits con un número de 16 bits que tengo y mantener los 16 bits superiores de ese número en producir un nuevo número binario ... ¿cómo puedo hacer esto usando un simple operador bit a bit?Algoritmo para virar en bits

Por ejemplo, el número binario de 32 bits es:

1010 0000 1011 1111 0100 1000 1010 1001 

y la inferior de 16 bits que tengo es:

    0000 0000 0000 0001 

lo que el resultado es:

1010 0000 1011 1111 0000 0000 0000 0001 

¿Cómo puedo hacer esto?

+0

quiero hacer esto en un solo paso – aherlambang

+0

No se puede hacer esto con 1 operador. Necesita al menos 2, y con extensión de signo involucrada, 3. – polygenelubricants

Respuesta

8

Esto se hace en dos pasos:

  • enmascarar los bits que desea reemplazar (Y con 0s)
  • Rellene los reemplazos (O con los nuevos bits)

Así, en su caso,

i32 number; 
i32 mask_lower_16 = FFFF0000; 
i16 newValue; 

number = (number AND mask_lower_16) OR newValue; 

en la implementación real lenguaje de programación, también puede ser necesario para abordar el problema de la extensión de signo en el valor de 16 bits. En Java, por ejemplo, usted tiene que enmascarar los 16 bits superiores del short así:

short v = (short) 0xF00D; 
    int number = 0x12345678; 
    number = (number & 0xFFFF0000) | (v & 0x0000FFFF); 
    System.out.println(Integer.toHexString(number)); // "1234f00d" 
+3

+1. muy bien explicado. –

+1

Si el OP es un novato, tenga en cuenta la diferencia entre Y lógico (&&) y AND (&) –

+0

en tiempo Listo. También se abordó el problema de la extensión de la señal – polygenelubricants

3
(original32BitNumber & 0xFFFF0000) | 16bitNumber 
+1

segunda operación debe ser OR – vpram86

+0

¡Gracias! ¡Debo haber hecho esto millones de veces y aun así me las arreglé para escribir lo incorrecto! –

+0

+1 ¡¡Esto es !! –

1

Bueno, podría decirle la respuesta. Pero tal vez esto es tarea. Entonces no lo haré.

Considere que usted tiene algunas opciones:

| // bitwise OR 
^ // bitwise XOR 
& // bitwise AND 

Tal elaborar una pequeña mesa y decidir cuál le dará el resultado correcto (cuando se opera en la parte derecha de su número binario grande).

1

use & para enmascarar los bits bajos y luego | fusionar el valor de 16 bits con el valor de 32 bits

uint a = 0xa0bf68a9 
short b = 1 

uint result = (a & 0xFFFF0000) | b; 
Cuestiones relacionadas