通过使用 size_t 的否定翻转最低有效一位

oph*_*mac 3 c++ bit-manipulation bit

我最近遇到了一段据称可以正常工作的代码,但我不太明白为什么。

size_t a = 19;
std::cout<<std::bitset<8>(a)<<std::endl;
a ^= a & -a;
std::cout<<std::bitset<8>(a)<<std::endl;
Run Code Online (Sandbox Code Playgroud)

这段代码将反转给定无符号整数的最低有效位。我宁愿只写a ^= 1;,但我对为什么上面的代码实际上有效感到困惑。我认为做出unsigned int否定会导致未定义的行为?

Bat*_*eba 5

a & -a为您提供a. 对于奇数,它确实是 1,但通常情况并非如此。

制备unsigned负是一个明确定义和偶尔有用符号:-a用于正a-a+ 2 Ñ其中N是在类型的比特的数量。写作另一种size_t a = std::numeric_limits<size_t>::max();是写size_t a = -1;的例子。

因此a ^= a & -a;将最低有效的 1 位翻转为 0。

确实比较聪明。