如何检查 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 1111
是 0x000F
十六进制。
可以看到,因为0x00FF
的倒数第二个字节都是0
,所以在0x00FF
和任意数之间进行bitwise and运算的结果将产生所有 0
的第二个最低有效字节的结果。由于 0x050F
的第二个最不重要的字节并不都是 0
,因此您的比较永远不可能是真的。
我在 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 1111
是 0x000F
十六进制。
可以看到,因为0x00FF
的倒数第二个字节都是0
,所以在0x00FF
和任意数之间进行bitwise and运算的结果将产生所有 0
的第二个最低有效字节的结果。由于 0x050F
的第二个最不重要的字节并不都是 0
,因此您的比较永远不可能是真的。