Mam funkcja nazywa replaceByte(x,n,c)
który ma zastąpić bajt n
w x
z c
z następującymi ograniczeniami:zastąpić bajt w 32 bitowy numer
- Bytes numerach od 0 (LSB) do 3 (MSB)
- Przykłady:
replaceByte(0x12345678,1,0xab) = 0x1234ab78
- można założyć 0 < < = n = 3 0 < = c < = 255
- ops prawne :
! ~ &^| + << >>
Maks ops: 10
int replaceByte(int x, int n, int c) { int shift = (c << (8 * n)); int mask = 0xff << shift; return (mask & x) | shift; }
ale kiedy testować mi ten błąd:
ERROR: Test replaceByte (-2147483648 [0x80000000] 0 [0x0] 0 [0x0]) nie powiodło się ... ... Daje 0 [0x0]. Powinny być -2147483648 [0x80000000]
po zdając sobie sprawę, że * nie jest operatorem prawne I wreszcie zdobione go ... a jeśli jesteś ciekaw, to co zrobiłem:
int replaceByte(int x, int n, int c) {
int mask = 0xff << (n << 3);
int shift = (c << (n << 3));
return (~mask & x) | shift;
}
hmmm nawet z tym, otrzymuję ten sam błąd – asdfghjkl
@shaynie Zobacz moją edycję –
Czy możesz wyjaśnić, w jaki sposób -> "int maska = 0xff << przesunięcie;" działa dla Ciebie. tak jak OP powinien prawdopodobnie be "int mask = 0xff << (n << 3);" –