Rust 锈:为什么编译器会翻译!!价值即价值?

Rust 锈:为什么编译器会翻译!!价值即价值?,rust,Rust,有人能解释一下为什么像下面的例子一样使用而不是操作符两次吗 setBits+=!!(n&mask);//如果n和掩码之间的某些位匹配,则setBits=1,否则setBits=0 它基本上在C语言中工作,在我以这种方式重写它之后也可以工作: setBits+=if(n&mask)!=0{1}其他{0}; 在生锈情况下不能正常工作?现在,它返回n&mask的值,而我想强制两次不在字节码级别,并避免分支(cmp指令) NB:我刚刚检查了汇编代码,很明显,Rust编译器对其进行了优化… 但是!!值

有人能解释一下为什么像下面的例子一样使用
而不是
操作符两次吗

setBits+=!!(n&mask);//如果n和掩码之间的某些位匹配,则setBits=1,否则setBits=0
它基本上在C语言中工作,在我以这种方式重写它之后也可以工作:

setBits+=if(n&mask)!=0{1}其他{0};
在生锈情况下不能正常工作?现在,它返回n&mask的值,而我想强制两次不在字节码级别,并避免分支
cmp
指令)

NB:我刚刚检查了汇编代码,很明显,Rust编译器对其进行了优化…
但是
!!值
不等于值

任何强制
不执行x2
和避免
CMP
指令的方法?

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

0x00000000
0xFFFFFF
这就是为什么
通常不会执行任何操作

如果
,您仍然可以通过以下方式在不使用
的情况下执行此操作:


你以5秒的优势击败了我,并为boot提供了一个更好的答案。:)我在本地测试,刚刚发现它也不等于~neg。这是非常混乱的,我不理解使用
的设计选择 >而不是<代码> ~ <代码> NEG,尤其是如果RID正在吸引C和C++开发人员的话。无论如何,在《铁锈》中,没有办法称之为
NOT
?@AntoninGAVREL您指的是哪个
NOT
指令?C和C++的OnEcess,拼写为“代码> x==0 < /代码>
let bits = 0u32;
println!("{:#010X}", bits);
println!("{:#010X}", !bits);
setBits += (n & mask != 0) as u32; // assuming u32s