2017-04-11 3 views
2

Also im Debugger habe ich festgestellt, dass ich prüfen muss, ob 1 Bit auf einen bestimmten Wert eingestellt ist.C++ 1 Bit aus dem Speicher lesen?

Zum Beispiel sagen wir an dieser Speicheradresse 0x12345 hält diese vier Bytes 01008100, wie würde ich gehen zu prüfen, ob nur 8 ist genau dort in genau diesem Punkt? Tut mir leid, ich habe einen Mangel an Wörtern zu benutzen, ich bin mir nicht einmal sicher, wie ich das wirklich erklären soll. Aber wenn zum Beispiel wollte ich überprüfen, ob 8 genau dort war genau in dieser Position in dem oben meiner ersten Vermutung geschrieben Bytes wäre, etwas zu versuchen, wie dies

if(*(char*)(0x12345 + 0x2) == 8) 
{ 
    //ok 
} 

Aber das wird obivously nicht funktionieren, weil es wird gelesen der Wert als 0x81, muss ich nur lesen, wenn die 8 da ist und alle anderen Bits davor oder dahinter ignorieren. Hoffentlich wurde diese Frage so formuliert, dass zumindest jemand meine Frage versteht. Danke fürs Lesen, einen schönen Tag.

+0

Aus Gründen der Formulierung ist "8" in diesem Fall kein 1 Bit, sondern eine Zahl der hexadezimalen Darstellung Ihres Bytes. – Drax

Antwort

0

Sie können ein bitweises UND (&) verwenden, um einzelne Bits zu testen, z.

if ((*(char*)(0x12345 + 0x2) & 0x80) == 0x80) 
{ 
    //ok 
} 

Beachten Sie, dass die UND-Operation Masken aus die Bits, die Sie nicht daran interessiert sind, z.B.

0x12345 + 0x2: 10000001 ; 0x81 

AND with 0x80: 10000000 ; 0x80 
+0

sollte '& 0x80) == 0x80' sein – Matthias247

+0

@ Matthias247: danke - behoben. –

0

Es sieht so aus, als ob Sie überprüfen möchten, ob ein bestimmtes Bit in Ihrem 4-Byte-Wert gesetzt ist oder nicht.

Unter der Annahme, dass Sie das Bit auf einen Strom von Bytes, und nicht auf einem 32-Bit-Wert überprüfen wollen, dann würde ich etwas verwenden, ähnlich dem, was Sie angegeben haben, aber ich würde eine bitweise und Operator:

if((*(std::uint8_t*)(0x12345 + 0x2) & 0x80) != 0) 
{ 
    // the bit is set 
} 

Wenn Sie versuchen, das Bit in einem Uint32-Wert zu überprüfen, müssen Sie die Endianität der Maschine berücksichtigen, mit der Sie arbeiten (High- oder Low-Bit-Endian).

Glücklicherweise, wenn Sie den richtigen Datentyp angeben, wird die Maschine das für Sie übernehmen.

// Note: 0x12345 is a fictional address, not properly aligned on some architectures 
if((*(std::uint32_t*)0x12345 & 0x00008000) != 0) 
{ 
    // the bit is set 
} 
+1

@Raul R: Danke für die Rückmeldung. Ich habe den Kommentar verschoben, um ihn besser sichtbar zu machen –

Verwandte Themen