ho una funzione chiamata replaceByte(x,n,c)
che sostituirà byte n
in x
con c
con le seguenti limitazioni:sostituire byte a 32 bit numero
- Bytes numerate da 0 (LSB) a 3 (MSB)
- Esempi:
replaceByte(0x12345678,1,0xab) = 0x1234ab78
- si può assumere 0 < = n = < 3 e 0 = c < < = 255
- ops legali :
! ~ &^| + << >>
Max ops: 10
int replaceByte(int x, int n, int c) { int shift = (c << (8 * n)); int mask = 0xff << shift; return (mask & x) | shift; }
ma quando provo io ottenere questo errore:
ERRORE: test replaceByte (-2147483648 [0x80000000], 0 [0x0], 0 [0x0]) non riuscito ... ... Fornisce 0 [0x0]. Dovrebbe essere -2147483648 [0x80000000]
dopo aver realizzato che * non è un operatore legale ho finalmente capito ... e se siete curiosi, questo è quello che ho fatto:
int replaceByte(int x, int n, int c) {
int mask = 0xff << (n << 3);
int shift = (c << (n << 3));
return (~mask & x) | shift;
}
hmmm anche con quello, sto ricevendo lo stesso errore – asdfghjkl
@shaynie Vedi la mia modifica –
Puoi spiegare come -> "int mask = 0xff << shift;" funziona per te. Sembra errato me. Come l'OP aggiornato dovrebbe probabilmente be "int mask = 0xff << (n << 3);" –