这行代码如何否定 std::uint64_t 值?

Raf*_*elo 1 c++

我试图理解这段代码的作用。这应该否定系数模coeff类型uint64_t*为 的多项式的modulus_value类型系数const uint64_t

std::int64_t non_zero = (*coeff != 0);
*coeff = (modulus_value - *coeff) & static_cast<std::uint64_t>(-non_zero);
Run Code Online (Sandbox Code Playgroud)

到底怎么了& static_cast<std::uint64_t>(-non_zero)?这怎么能否定任何事情呢?

代码来自这里

Ben*_*igt 6

此代码是无分支版本

if (*coeff) *coeff = (modulus_value - *coeff);
// else *coeff = *coeff;
Run Code Online (Sandbox Code Playgroud)

否定是(modulus_value - *coeff).

实现& static_cast<std::uint64_t>(-non_zero)没有分支的条件,并且与否定完全无关。


FWIW,您可能会更好地使用易于理解的if声明版本。具有“条件 MOV”的体系结构将使用它而不是分支,并且其他体系结构的编译器几乎总是知道如何优化对无分支版本的条件分配。


另外两个等效版本是:

*coeff = (*coeff) ? (modulus_value - *coeff) : (*coeff);
Run Code Online (Sandbox Code Playgroud)

*coeff = (*coeff) ? (modulus_value - *coeff) : 0;
Run Code Online (Sandbox Code Playgroud)

所有这些对于人类和编译器来说都比问题中的版本更容易理解。