如何检查 C++ 中的位?

How To Check bits in C++?

我在 C++ 中写道:

bool ret_is_syscall = (ret_inst_data & 0x00000000000000FF) == 0x000000000000050f;

但是clion说总是错的,为什么?

我正在尝试检查最后 4 个是否 0x050f

0xFF 掩码只留下 8 位可供查看,但 0x50f 占用 11 位。所以比较永远不可能是真的。

如果您只对最后 4 感兴趣,请改用 0x0f 的掩码:

bool ret_is_syscall = (ret_inst_data & 0x000000000000000f) == 0x000000000000000f;

否则,你需要一个至少0x7FF(11位)的掩码才能与0x50f进行比较:

bool ret_is_syscall = (ret_inst_data & 0x00000000000007ff) == 0x000000000000050f;

如果您对最后 4 个 十六进制数字感兴趣(16 位),请改用 0xffff 掩码:

bool ret_is_syscall = (ret_inst_data & 0x000000000000ffff) == 0x000000000000050f;

如果要检查 ret_inst_data 的最低有效 2 个字节是否恰好具有值 0x050F,则需要使用掩码 0xFFFF:

bool ret_is_syscall = (ret_inst_data & 0xFFFF) == 0x050F;

至于为什么你原来的比较不正确,我们只看所涉及数字的最低位两个字节。

  • 0x050F 具有位模式 0000 0101 0000 1111
  • 0x00FF 具有位模式 0000 0000 1111 1111

如果我们按位和这两个模式一起,我们得到位模式

  0000 0101 0000 1111
& 0000 0000 1111 1111
---------------------
  0000 0000 0000 1111

二进制 0000 0000 0000 11110x000F 十六进制。

可以看到,因为0x00FF的倒数第二个字节都是0,所以在0x00FF和任意数之间进行bitwise and运算的结果将产生所有 0 的第二个最低有效字节的结果。由于 0x050F 的第二个最不重要的字节并不都是 0,因此您的比较永远不可能是真的。