【问题标题】:Rust: Why would the compiler translate !!value as value?Rust:为什么编译器会将 !!value 翻译为 value?
【发布时间】:2021-03-11 19:07:58
【问题描述】:

有人能解释一下为什么使用NOT 运算符两次,如下例所示:

setBits += !!(n & mask); // if some bits match between n and mask, setBits = 1, else setBits = 0

这基本上可以在 C 语言中使用,并且在我这样重写后也可以使用:

setBits += if (n & mask) != 0 {1} else {0};

在 Rust 中不能按预期工作?截至目前,它返回 n 和掩码的值,而我想在字节码级别强制两次 NOT 并避免分支cmp 指令)。

注意:我刚刚检查了汇编代码,显然 Rust 编译器优化了它...
但是!!value 不等同于value

有什么方法可以强制NOT x2 并避免CMP 指令?

【问题讨论】:

    标签: rust


    【解决方案1】:

    Rust 的 Not 运算符 (!) 不返回 bool,而是返回值的位否定。它更类似于 C/C++ 的按位非运算符 (~):

    let bits = 0u32;
    println!("{:#010X}", bits);
    println!("{:#010X}", !bits);
    
    0x00000000
    0xFFFFFFFF
    

    这就是为什么!! 通常不会做任何事情的原因。

    您仍然可以在没有if by converting the bool from != 0 into an integer 的情况下执行此操作:

    setBits += (n & mask != 0) as u32; // assuming u32s
    

    【讨论】:

    • 你比我快 5 秒,并提供更好的启动答案。 :)
    • 我在本地进行了测试,结果发现 not 也等于 ~ neg。这非常令人困惑,我不明白使用! 而不是~ 的设计选择NEG,特别是如果Rust 想要吸引C 和C++ 开发人员。无论如何,在 Rust 中,没有办法调用 NOT
    • @AntoninGAVREL 您指的是哪条NOT 指令? The x86 one does what Rust does, not what C does.
    • C 和 C++ 合一
    • 是的,拼写为x == 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2014-10-07
    • 1970-01-01
    • 2013-03-24
    • 2014-09-13
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多