如何解决按位 AND
我不喜欢这么多嵌套的 if,这就是为什么我想要与条件 if (section_header[i].characteristics & IMAGE_SCN_MEM_WRITE)
相反的原因。那会是什么?我试过 if (section_header[i].characteristics & ~IMAGE_SCN_MEM_WRITE) continue
,但它不是正确的。
for (WORD i = 0; i < nt_headers->FileHeader.NumberOfSections; ++i)
{
if (functions[i] >= section_header[i].VirtualAddress && functions[i] < section_header[i].VirtualAddress + section_header[i].Misc.VirtualSize)
{
if (section_header[i].characteristics & IMAGE_SCN_MEM_WRITE)
{
... next
}
}
}
解决方法
翻转条件是减少“箭头代码”(大量缩进的代码)的常见做法:
for (WORD i = 0; i < nt_headers->FileHeader.NumberOfSections; ++i) {
if(!(section_header[i].VirtualAddress < functions[i] && functions[i] < section_header[i].VirtualAddress + section_header[i].Misc.VirtualSize)) {
continue;
}
if((section_header[i].Characteristics & IMAGE_SCN_MEM_WRITE) == 0) {
continue;
}
// From this point
// It's now guaranteed that selected function is in range and
// the selected section_header contains the IMAGE_SCN_MEM_WRITE bit
}
,
如果您确定您的掩码只会设置一位,那么您可以通过执行
来测试value
中该位是否已清除(即未设置)
if (~value & MASK)
// bit is clear
但是,我不建议这样做。虽然在逻辑上是正确的,但它比其他建议的选项 if (!(value & MASK))
或 if ((value & MASK) == 0)
不那么惯用。阅读您的代码的人更有可能误解,这可能导致他们通过“修复”代码来创造新的错误。
此外,如果 MASK
应设置多于一位,则表达式 ~value & MASK
表达式将为真,如果这些位中的 any 在 {{1} 中被清除},所以它不再是 value
的逻辑否定。例如,如果 value & MASK
和 MASK == 0x3
,则 value == 0x2
为真,value & MASK
也为真。相比之下,~value & MASK
为真,当 所有 那些位都被清除。
首先您需要确定“特性”项目的类型。是 uint32_t 吗?这很重要,因为如果您尝试融合不兼容的类型,AND 操作可能会混淆。
这是我的做法:
...
auto typed_flag = (uint32_t)IMAGE_SCN_MEM_WRITE;
if (((section_header[i].Characteristics bitand typed_flag) == typed_flag)
{
continue;
}
...
注意:'bitand' 比 & 符号更像 C++(尽管两者完全一样)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。