2012-04-12 6 views
6

Ich habe eine Funktion namens replaceByte(x,n,c) dieses Byte n in x mit c mit folgenden Einschränkungen zu ersetzen ist:ersetzen Byte in 32-Bit-Zahl

  • Bytes nummeriert von 0 (LSB) bis 3 (MSB)
  • Beispiele: replaceByte(0x12345678,1,0xab) = 0x1234ab78
  • Sie können 0 annehmen < = n < = 3 und 0 < = c < = 255
  • Rechts ops : ! ~ &^| + << >>
  • Max ops: 10

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

aber wenn ich es testen, bekomme ich diesen Fehler:

ERROR: Test replaceByte (-2147483648 [0x80000000], 0 [0x0], 0 [0x0]) fehlgeschlagen ... ... Gibt 0 [0x0]. Sollte -2147483648 [0x80000000]

danach zu realisieren * ist keine juristische Betreiber Ich habe es endlich herausgefunden ... und wenn Sie neugierig sind, ist es das, was ich getan habe:

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

Antwort

4

Ahh ... Du bist fast da.

ändern Gerade

return (mask & x) | shift; 

zu

return (~mask & x) | shift; 

Die mask sollte nur Einsen mit Ausnahme für die Region enthalten, maskiert und nicht umgekehrt werden.

ich diesen einfachen Code verwende und es funktioniert in gcc feinen

#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 sogar mit dem, ich bekomme den gleichen Fehler – asdfghjkl

+0

@shaynie Siehe meine Bearbeitung –

+0

Können Sie erklären, wie -> "int Maske = 0xff << shift;" funktioniert für Sie. Scheint falsch zu Ich. Wie OP sollte wahrscheinlich aktualisiert werden sei "int mask = 0xff << (n << 3);" –

6

Da diese sieht aus wie Hausaufgaben, ich werde schreiben Code nicht, aber die Schritte auflisten Sie durchführen müssen:

  1. Guss c in mehr 32-Bit, so dass Sie
  2. Weiter keine Bits verlieren während des Schaltens, Verschiebung c durch die geeignete Anzahl von Bits nach links (wenn n==0 keine Verschiebung, wenn n==1 Verschiebung um 8 etc.)
  3. Erstellen Sie eine 32-Bit-Bitmaske, die die niedrigsten 8 Bits von x Null wird, dann diese Maske um den gleichen Betrag wie die verschieben letzter Schritt
  4. führt bitweise uND den verschobenen Bitmaske und x die entsprechenden Bits x
  5. führt bitweise auf Null oder (oder Addition) des verschobenen c Wertes und x die maskierten Bits der letzteren
zu ersetzen,
+0

ok Ich verstehe alle, dass mit Ausnahme des Teils, wo Sie sagen, „Erstellen eines 32-Bit-Bit-Maske, die die niedrigsten 8 Bits von null x ..." – asdfghjkl

+0

@shaynie Bevor Sie die Bits von' x' ersetzen, müssen Sie die 8 Bits, die ersetzt werden sollen, auf Null setzen. Das ist, wo diese Bitmaske reinkommt. – Praetorian

+0

ok, das macht Sinn, ich habe etwas über diesen Code geschrieben haben eingereicht und der Fehler, den ich erhalte – asdfghjkl