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否定会导致未定义的行为?
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。
确实比较聪明。