Wenn ich einen Zeiger auf den Anfang eines Speicherbereichs habe und ich den in den Bits 30, 31 und 32 dieser Region gepackten Wert lesen muss, wie kann ich diesen Wert lesen?Lesen von Bits in einem Speicher
Antwort
Verwendung bit masks.
Es hängt davon ab, wie groß ein Byte in Ihrer Maschine ist. Die Antwort hängt davon ab, ob Sie für diese Nummern eine Null- oder eine Indizierung durchführen. Die folgende Funktion liefert 0, wenn das Bit 0 und Nicht-Null, wenn es 1.
int getBit(char *buffer, int which)
{
int byte = which/CHAR_BIT;
int bit = which % CHAR_BIT;
return buffer[byte] & (1 << bit);
}
Wenn Ihr Compiler optimieren kann nicht gut genug ist, um die Teilung und mod Operationen in Bit-Operationen zu drehen, Sie könnten es tun explizit, aber ich bevorzuge diesen Code für die Klarheit.
(Edited einen Fehler zu beheben und zu CHAR_BIT, das ist eine großartige Idee zu ändern.)
Bei einem 32-Bit-System können Sie den Zeiger einfach nach rechts 29 verschieben. Wenn Sie die Bitwerte an Ort und Stelle benötigen und um 0xE0000000.
würde ich wahrscheinlich generalize this answer etwas wie folgt aus:
template <typename T>
bool get_bit(const T& pX, size_t pBit)
{
if (pBit > sizeof(pX) * CHAR_BIT)
throw std::invalid_argument("bit does not exist");
size_t byteOffset = pBit/CHAR_BIT;
size_t bitOffset = pBit % CHAR_BIT;
char byte = (&reinterpret_cast<const char&>(pX))[byteOffset];
unsigned mask = 1U << bitOffset;
return (byte & mask) == 1;
}
Bit einfacher zu bedienen:
int i = 12345;
bool abit = get_bit(i, 4);
- 1. Lesen/Schreiben von Bits von einer langen
- 2. Lesen <8 Bits von einem Leser in Golang
- 3. stahl Bits von einem Zeiger
- 4. Lesen Bits aus der Datei
- 5. lesen Bits und nicht Int aus einem Sockel
- 6. Speicher von ".exe" + Offset lesen?
- 7. Ansatz zum Lesen einer beliebigen Anzahl von Bits in Swift
- 8. Wie verteilt man Bits in einem Byte?
- 9. EEPROM Lesen und Schreiben für 5 Bits
- 10. Manipulation von Feldern in einem Array von Bits in C++
- 11. So lesen Sie LSB-Bits mit C#
- 12. Lesen json von android internen Speicher Fehler
- 13. Bits in einem Integer in Python ändern
- 14. Lesen von einem riesigen MemoryStream in C#
- 15. Python: Bits aus einem Byte Extrahierung
- 16. Löschen von Bits in einem Register in Assembly
- 17. Bits Erhalten von Byte
- 18. Verketten von Bits in VHDL
- 19. Setzen von Bits in C
- 20. Verketten von Bits in C++
- 21. Lesen interner Flash-Speicher Inhalt
- 22. Speicher von Objekten in einem Array von einem zweiten Objekt
- 23. Wie Bits von Nummer
- 24. Lesen anderer Prozess 'Speicher in OS X?
- 25. Lesen aus dem Speicher-Stream in Zeichenfolge
- 26. Speicher von Zertifikatskette in einem pkcs12 Schlüsselspeicher
- 27. Lesen von Bytes aus der Datei in den Speicher
- 28. Wie kann ich einzelne Bits in einem Float bekommen/setzen?
- 29. Javascript - Ganzzahl in Array von Bits konvertieren
- 30. C++ - Anzahl der Bits pro Pixel aus BMP-Datei lesen
Verwenden 'CHAR_BIT' statt 8. – GManNickG
Sollte dies nicht sein:' Rückgabepuffer [Byte] & (1 << Bit); '? Es fühlt sich an, als ob Sie zu viele Bits zulassen, wenn (zum Beispiel) Bit == 3. –
@platinum yup. Zu schnell tippen. Jetzt reparieren. –