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。
确实比较聪明。
归档时间: |
|
查看次数: |
115 次 |
最近记录: |