rust - Rust:为什么编译器将!! value转换为value?

标签 rust

有人可以澄清为什么像下面的示例一样两次使用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&mask的值,而我想在字节码级别强制两次NOT,并且避免分支(cmp指令)。
注意:我刚刚检查了汇编代码,显然Rust编译器对其进行了优化...
但是!!value不等于value

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

最佳答案

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

let bits = 0u32;
println!("{:#010X}", bits);
println!("{:#010X}", !bits);
0x00000000
0xFFFFFFFF
因此,这就是!!通常不执行任何操作的原因。
您仍然可以通过converting the if from bool into an integer在没有!= 0的情况下执行此操作:
setBits += (n & mask != 0) as u32; // assuming u32s

关于rust - Rust:为什么编译器将!! value转换为value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66588950/

相关文章:

rust - 如何运行从 Atom 内部的标准输入读取的代码?

macros - 我可以通过宏中的多个规则重复匹配吗?

rust - 如何在转义序列中使用变量?

syntax - 元组、结构和元组结构需要在 Rust 中具有不一致的语法吗?

rust - 如何为特征的每个实现自动生成递增的数字标识符?

regex - 如何计算 Rust 中的正则表达式匹配?

rust - Rust 中有传统风格的 switch 语句吗?

rust - web3::contract::Contract::query 的 "params"参数应该是什么样的?

Rust 宏规则嵌套重复

json - 如何在写入文件之前删除文件的内容?