有人可以澄清为什么像下面的示例一样两次使用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/