2012-04-12 19 views
6

tengo una función llamada replaceByte(x,n,c) que es reemplazar bytes n en x con c con las siguientes restricciones:reemplazar byte de 32 bits número

  • Bytes numeradas del 0 (LSB) a 3 (MSB)
  • Ejemplos: replaceByte(0x12345678,1,0xab) = 0x1234ab78
  • se puede asumir 0 < = n < = 3 y 0 < = c < = 255
  • ops legales : ! ~ &^| + << >>
  • ops Max: 10

    int replaceByte(int x, int n, int c) { 
         int shift = (c << (8 * n)); 
         int mask = 0xff << shift; 
         return (mask & x) | shift; 
        } 
    

pero cuando lo pruebo me sale este error:

ERROR: Prueba replaceByte (-2147483648 [0x80000000], 0 [0x0], 0 [0x0]) falló ... ... Da 0 [0x0]. En caso de ser -2147483648 [0x80000000]

después de darse cuenta de que * no es un operador jurídico fin he descubierto ... y si usted es curioso, esto es lo que hice:

int replaceByte(int x, int n, int c) { 
    int mask = 0xff << (n << 3); 
    int shift = (c << (n << 3)); 
    return (~mask & x) | shift; 
} 

Respuesta

4

Ahh ... Ya casi estás allí.

Sólo cambia

return (mask & x) | shift; 

a

return (~mask & x) | shift; 

El mask debe contener todos los excepción de la región a ser enmascarado y no al revés.

estoy utilizando este código simple y funciona bien en gcc

#include<stdio.h> 

int replaceByte(int x, int n, int c) 
{ 
    int shift = (c << (8 * n)); 
    int mask = 0xff << shift; 
    return (~mask & x) | shift; 
} 

int main() 
{ 

    printf("%X",replaceByte(0x80000000,0,0)); 

    return 0; 
} 
+2

hmmm incluso con eso, estoy obteniendo el mismo error – asdfghjkl

+0

@shaynie Vea mi edición –

+0

¿Puede explicar cómo funciona?> "máscara int = 0xff << cambio;" funciona para usted. Parece incorrecto yo. Al igual que OP actualizado probablemente ser "int mask = 0xff << (n << 3);" –

6

Desde este parece que la tarea no voy a publicar el código, pero enumerar los pasos que debe realizar:

  1. c moldeada en un número de 32 bits para que no se pierda ningún bit mientras se cambia
  2. a continuación, cambiar c por el número adecuado de bits a la izquierda (si n==0 no cambia, si n==1 cambia por 8, etc.)
  3. Cree una máscara de bits de 32 bits que pondrá a cero los 8 bits más bajos de x, luego cambie esta máscara por la misma cantidad que último paso
  4. Realizar AND bit a bit de la máscara de bits desplazado y x a cero fuera de los bits apropiados de x
  5. Realizar OR bit a bit (o adición) de la c valor desplazado y x para reemplazar los bits enmascarados de este último
+0

bien entiendo todo eso a excepción de la parte donde se dice "Crear una máscara de bits de 32 bits que va a cero los 8 bits más bajos de X..." – asdfghjkl

+0

@shaynie Antes de ir a reemplazar los bits de' x' necesitas poner a cero los 8 bits que van a ser reemplazados. Ahí es donde entra esa máscara de bits. – Praetorian

+0

bien, eso tiene sentido, puse un código arriba que yo enviado y el error que estoy recibiendo – asdfghjkl

Cuestiones relacionadas