Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;从内存中读取1位?_C++_Memory_Byte_Memory Address_Bits - Fatal编程技术网

C++ C++;从内存中读取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存在时读取,并忽略前面或后面的所有其他位。

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

例如,让我们假设在这个内存地址
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:感谢您的反馈。我移动了评论以使其更明显