2012-04-12 12 views
6

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; 
} 

Odpowiedz

4

Ahh ... Jesteś prawie na miejscu.

Wystarczy zmienić

return (mask & x) | shift; 

do

return (~mask & x) | shift; 

mask powinien zawierać wszystkie te poza regionem być maskowane, a nie odwrotnie.

Używam tego prostego kodu i działa dobrze w 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 nawet z tym, otrzymuję ten sam błąd – asdfghjkl

+0

@shaynie Zobacz moją edycję –

+0

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);" –

6

Od tego wygląda praca domowa I nie zamierzam pisać kod, ale listy czynności, które należy wykonać:

  1. Odlewanie c w liczbie 32-bitowym, aby nie stracić żadnych bitów podczas przesuwania
  2. Dalej, shift c przez Odpowiednia liczba bitów w lewo (w przypadku n==0 przesunięcie nie jeśli n==1 przesunięcie o 8 etc.)
  3. utworzyć 32-bitowy bitową, która ZERO najmniejsza 8 bitów x, a następnie przejście tej maski w takiej samej ilości jak ostatni etap
  4. wykonać bitowego i przesuniętej maskę bitową i x zero na odpowiednie kawałki x
  5. wykonać logicznym OR (lub dodatkowo) przesuniętej wartości c i x zastąpić maskowane bity drugie
+0

ok rozumiem to wszystko z wyjątkiem części, w której mówisz „Tworzenie 32-bitową maskę bitową, która będzie zerowy najniższe 8 bitów x ..." – asdfghjkl

+0

@shaynie Zanim przystąpisz do wymiany bitów' x', musisz wyzerować 8 bitów, które zostaną zastąpione.To właśnie tam pojawia się ta maska ​​bitowa. – Praetorian

+0

OK, to ma sens, umieszczam kod wyżej niż przedłożyłem i błąd, który otrzymuję – asdfghjkl

Powiązane problemy