C++ C++;从内存中读取1位?
所以在调试器中,我发现我需要检查1位是否设置为某个值 例如,让我们假设在这个内存地址C++ C++;从内存中读取1位?,c++,memory,byte,memory-address,bits,C++,Memory,Byte,Memory Address,Bits,所以在调试器中,我发现我需要检查1位是否设置为某个值 例如,让我们假设在这个内存地址0x12345保存这四个字节01008100,我将如何检查是否只有8在该确切点上?对不起,我没有用词,我甚至不知道如何真正解释。但例如,如果我想检查8是否就在上面发布的字节中的那个确切位置,我的第一个猜测是尝试这样的方法 if(*(char*)(0x12345 + 0x2) == 8) { //ok } 但这显然不起作用,因为它将读取值为0x81,我只需要在8存在时读取,并忽略前面或后面的所有其他位。
0x12345
保存这四个字节01008100
,我将如何检查是否只有8
在该确切点上?对不起,我没有用词,我甚至不知道如何真正解释。但例如,如果我想检查8
是否就在上面发布的字节中的那个确切位置,我的第一个猜测是尝试这样的方法
if(*(char*)(0x12345 + 0x2) == 8)
{
//ok
}
但这显然不起作用,因为它将读取值为0x81
,我只需要在8
存在时读取,并忽略前面或后面的所有其他位。希望这个问题的措辞至少有人能理解我的问题。感谢您的阅读祝您愉快。您可以使用位AND(&
)来测试单个位,例如
if ((*(char*)(0x12345 + 0x2) & 0x80) == 0x80)
{
//ok
}
请注意,AND操作屏蔽了您不感兴趣的位,例如
0x12345 + 0x2: 10000001 ; 0x81
AND with 0x80: 10000000 ; 0x80
看起来您想检查是否设置了4字节值中的特定位 假设您希望检查字节流上的位,而不是32位的值,那么我将使用类似于您指定的内容,但我将使用按位and运算符:
if((*(std::uint8_t*)(0x12345 + 0x2) & 0x80) != 0)
{
// the bit is set
}
如果你试图检查UTIT32值中的位,那么你必须考虑你正在使用的机器(高或低位字节)的字节数。 幸运的是,如果您指定了正确的数据类型,那么机器将为您处理这些数据
// Note: 0x12345 is a fictional address, not properly aligned on some architectures
if((*(std::uint32_t*)0x12345 & 0x00008000) != 0)
{
// the bit is set
}
应该是
&0x80)=0x80
为了便于使用,在本例中,8
不是1位,它是字节的十六进制表示形式的一位数。@Raul R:感谢您的反馈。我移动了评论以使其更明显