2011-03-06 105 views
3

比方說,我給了一個void*內存地址,我需要打印位於此內存地址中的位。我怎樣才能做到這一點?在內存中讀取/寫入位

在我的處理器中,內存地址是32位,內存值也是32位,int也是32位。 所以我想這樣做的:

unsigned int value = *memory_address; 

,然後通過簡單的算術運算(一些moddiv操作)來獲取保存在memory_address值的位。

例如value mod 2將給出該值的最後一位,依此類推。但從我可以告訴(我期待不同的位)它不起作用。任何想法爲什麼?

此外,是否有人知道現成的C源代碼「這樣做」,從內存讀取/寫入位?

+1

請詳細說明爲什麼您認爲這不起作用。 – 2011-03-06 08:33:26

回答

1

如何:

bool isBit4Set = ((*someAddress) & 0x8 != 0); 
(*someAddress) |= 0x8; // Set bit 4 
+1

假設'someAddress'是一個指針類型,也可能取決於字節順序。 – 2011-03-06 01:39:28

+2

好吧,它的名字給了它強烈的暗示,它是一個指針類型:) – 2011-03-06 01:42:29

4
int main() { 

    int a = 0xFFFF; 

    void * v = &a; // v points to a 

    int * aPtr = (int *) v; // aPtr also points to a 

    int b = *aPtr; // b gets the value aPtr points to, aka a or 0xFFFF 

    int aBit = (b >> 3) & 1; // aBit now contains bit 3 of the original a value 

    // toggle the bit 
    if (aBit) { 
    b &= ~(1 << 3); // set bit 3 to 0 
    } else { 
    b |= (1 << 3); // set bit 3 to 1 
    } 

    *aPtr = b; // update original a 
} 
7
unsigned int value = *((unsigned int*)memory_address); 
for(int i = 0; i < 32; i++) 
{ 
    printf("%d ", value >> i & 1); 
} 

您還可以使用數學運算符做移通過爲每個位和or它的價值。你必須得到的位值(2位索引的功率)和那。減去值在每個迭代,以確保模不返回我們看到前值:

for(int i = 0; i < 32; i++) 
{ 
    int bit_value = (int)pow(2,i + 1); 
    int num_bit_value = value % bit_value; 
    printf("%d ", num_bit_value ? 1 : 0 ); 
    value -= num_bit_value; 
} 
+1

好吧。這似乎太工作了。但你能否解釋我,爲什麼我的想法不是? – Johny 2011-03-06 02:05:38

1
bool getBit(void* data,int bit){ return ((*((int*)data)) & 1<<bit); } 

void setBit(void* data,int bit,bool set){ if(set){ (*((int*)data)) |= 1<<bit; }else{ (*((int*)data)) &= ~(1<<bit); } } 

爲簡單的用法

3

我發現將內存視爲連續的字符串而不是空指針更容易。通過這種方式,您可以根據需要尋址儘可能多的位。

下面是我如何做到這一點。

unsigned char 
get_bit(char *array, int bit) 
{ 
     int byte, k; 
     byte = bit/8; 
     k = 7 - bit % 8; 
     return array[byte] & (1 << k); 
} 


void 
set_bit(char *array, int bit, unsigned char value) 
{ 
     int byte, k; 
     byte = bit/8; 
     k = 7 - bit % 8; 
     if (value) 
       array[byte] |= (1 << k); 
     else 
       array[byte] &= ~(1 << k); 
} 
1

打印字節和位的通用解決方案。

void dump_data(const void *object, size_t size) 
{ 
    int i; 
    printf("[ \n"); 
    for(i = 0; i < size; i++) 
    { 
    if (i%4 ==0) 
    { 
     printf("@%02X",&((const unsigned char *) object)[i]); 
     printf("[ "); 
    } 
    printf("%02x ", ((const unsigned char *) object)[i] & 0xff); 
    if ((i+1)%4 == 0) 
     printf("]\n"); 
    } 
    printf("]\n"); 

    printf("BINARY FORMAT\n"); 
    for (i = 0; i < size; i++) 
    { 
    printf("@%02X",&((const unsigned char *) object)[i]); 
    printf("[ "); 
    unsigned char value = (((unsigned char*)object)[i]); 
    for(int j=0; j<8; j++) 
     printf("%d ", (value & (0x80 >> j)) ? 1 : 0); // right shifting the value will print bits in reverse. 
    printf("]\n"); 
    } 
}