C ++从内存中读取1位?

时间:2017-04-11 09:38:05

标签: c++ memory byte memory-address bits

所以查看调试器我发现我需要检查1位是否设置为某个值。

例如,假设在此内存地址0x12345保存了这四个字节01008100,我将如何检查是否只有8在那个确切点?对不起,我缺乏使用的话,我甚至不确定如何真正解释。但是,例如,如果我想检查8是否正确,那么在上面发布的那些字节中的确切位置我的第一个猜测就是尝试这样的事情

if(*(char*)(0x12345 + 0x2) == 8)
{
    //ok
} 

但是这显然不起作用,因为它会将值读为0x81,我只需要读取8是否存在并忽略其前面或后面的所有其他位。希望这个问题措辞的方式至少有人会理解我的问题。感谢您阅读有一个美好的一天。

2 个答案:

答案 0 :(得分:0)

您可以使用按位AND(&)来测试各个位,例如

if ((*(char*)(0x12345 + 0x2) & 0x80) == 0x80)
{
    //ok
}

请注意AND操作屏蔽您不感兴趣的位,例如

0x12345 + 0x2:    10000001    ; 0x81

AND with 0x80:    10000000    ; 0x80

答案 1 :(得分:0)

看起来您想要检查4字节值中的特定位是否已设置。

假设您要检查字节流上的位,而不是32位值,那么我会使用类似于您指定的内容,但我会使用按位和运算符:

if((*(std::uint8_t*)(0x12345 + 0x2) & 0x80) != 0)
{
    // the bit is set
}

如果您要检查uint32值中的位,则必须考虑使用的机器的字节序(高位或低位字节序)。

幸运的是,如果您指定了正确的数据类型,那么机器将为您处理。

// Note: 0x12345 is a fictional address, not properly aligned on some architectures
if((*(std::uint32_t*)0x12345 & 0x00008000) != 0) 
{
    // the bit is set
}