如果我有一個指向內存區域開始的指針,並且需要讀取打包在該區域的位30,31和32中的值,那麼如何讀取該值?讀取內存中的位
Q
讀取內存中的位
7
A
回答
8
使用bit masks。
3
這取決於您的機器中有多大的字節。答案會有所不同,具體取決於您是否對這些數字進行了零或索引編制。如果該位是0和非零值,如果它是1
int getBit(char *buffer, int which)
{
int byte = which/CHAR_BIT;
int bit = which % CHAR_BIT;
return buffer[byte] & (1 << bit);
}
如果你的編譯器不能優化井足以讓師和MOD業務併入位操作下面的函數返回0,你可以這樣做明確,但我更喜歡這個代碼的清晰。
(編輯,以修復bug和改變CHAR_BIT,這是一個好主意。)
0
在32位系統上,您可以簡單地將指針右移29位。如果您需要位值,並按0xE0000000。
1
我可能generalize this answer到這樣的事情:
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;
}
位更容易使用:
int i = 12345;
bool abit = get_bit(i, 4);
相關問題
- 1. 讀取內存中的各個位
- 2. 在內存中讀取/寫入位
- 3. C++從內存中讀取1位?
- 4. 讀取位於內存使用libavformat
- 5. 讀取任意內存位置?可能?
- 6. 從16位PE讀取內存地址
- 7. 內存讀取從SqlDataReader的
- 8. 如何讀取64位Linux內核環境的32位PCI條內存
- 9. 從vb.net的內存中讀取XML
- 10. QThread和讀取內存
- 11. C++ memcpy讀取內存
- 12. 讀取內存保護
- 13. ReadProcessMemory向後讀取內存?
- 14. Boost :: GIL從內存中讀取圖像
- 15. 從文件中讀取內存不足
- 16. Django和xlrd,從內存中讀取
- 17. 從文件中讀取動態內存
- 18. 在內存中讀取XLS文件ASP.Net
- 19. C++從共享內存中讀取
- 20. 從內存中讀取一點
- 21. 讀取內部閃存內容
- 22. gdb python模塊讀取內存內容
- 23. 讀取內核內存無需驅動
- 24. 在內存保護操作系統中讀取內存
- 25. 結合ndb.Tasklets與內存緩存讀取
- 26. 內存訪問衝突讀取位置調用std :: vector :: empty()時
- 27. i2c從機寫入和從內存位置讀取vhdl
- 28. 如何讓程序D讀取分配給程序A的內存中的內存位置?
- 29. 從共享內存段中讀取和寫入信號量的位置?
- 30. 從內存映射文件中讀取位圖比直接從磁盤中讀取要慢
使用'CHAR_BIT'而不是8 – GManNickG 2010-08-11 18:24:13
不應該是這樣:'返回緩衝區[byte]&(1 << bit);'?這感覺就像你允許太多比特通過(例如)位== 3。 – 2010-08-11 18:24:42
@platinum yup。輸入速度太快。現在解決。 – 2010-08-11 18:27:18