微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按位 AND

如何解决按位 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 & MASKMASK == 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 举报,一经查实,本站将立刻删除。