2010-08-11 98 views
7

如果我有一個指向內存區域開始的指針,並且需要讀取打包在該區域的位30,31和32中的值,那麼如何讀取該值?讀取內存中的位

回答

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

使用'CHAR_BIT'而不是8 – GManNickG 2010-08-11 18:24:13

+0

不應該是這樣:'返回緩衝區[byte]&(1 << bit);'?這感覺就像你允許太多比特通過(例如)位== 3。 – 2010-08-11 18:24:42

+0

@platinum yup。輸入速度太快。現在解決。 – 2010-08-11 18:27:18

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