我最近遇到一段代码,据说可以正常工作,但我不太明白为什么。
size_t a = 19;
std::cout<<std::bitset<8>(a)<<std::endl;
a ^= a & -a;
std::cout<<std::bitset<8>(a)<<std::endl;
这段代码将反转给定无符号整数的最低有效位。我宁愿只写 a ^= 1;
,但我对上面这段代码为什么能正常工作感到困惑。我认为使 unsigned int
为负数会导致未定义的行为吗?
最佳答案
a & -a
为您提供 a
中设置的最低有效 1 位.对于奇数,它确实是 1,但当然通常情况并非如此。
制作 unsigned
negative 是一个定义明确且偶尔有用的符号:-a
正 a
是-a
+ 2N 其中 N 是类型中的位数。替代写作 size_t a = std::numeric_limits<size_t>::max();
就是写size_t a = -1;
例如。
所以 a ^= a & -a;
将最低有效 1 位翻转为 0。
真的很聪明。
关于c++ - 通过使用 size_t 的否定翻转最低有效一位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63719178/