假设我有一个void*
内存地址,我需要打印位于此内存地址中的位。我怎么能这样做?
在我的处理器中,内存地址是32位,内存值也是32位,int也是32位。 所以我想到了这样做:
unsigned int value = *memory_address;
然后通过简单的算术(一些mod
和div
操作)来获取memory_address
中保存的值的位。
例如value mod 2
将给出该值的最后一位,依此类推。但是从我所知道的(我期待不同的位)它不起作用。有什么想法吗?
另外,是否有人知道现成的C源代码“做”这样做,从内存中读/写位?
答案 0 :(得分:7)
将每个位的值移1,将or
移1(
unsigned int value = *((unsigned int*)memory_address);
for( int i = 0; i < 32; i++)
{
printf("%d ", value >> i & 1);
}
您也可以使用数学运算符。您必须获取位值(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 :(得分: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
}
答案 2 :(得分:2)
我发现更容易将内存视为连续的字符串而不是void指针。这样,您可以根据需要寻址多个位。
我是这样做的。
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);
}
答案 3 :(得分:0)
怎么样:
bool isBit4Set = ((*someAddress) & 0x8 != 0);
(*someAddress) |= 0x8; // Set bit 4
答案 4 :(得分:0)
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); } }
简单用法
答案 5 :(得分:0)
打印字节和位的通用解决方案。
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");
}
}