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

标签 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;

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

最佳答案

a & -a为您提供 a 中设置的最低有效 1 位.对于奇数,它确实是 1,但当然通常情况并非如此。

制作 unsigned negative 是一个定义明确且偶尔有用的符号:-aa-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/

相关文章:

C++ 列表迭代器算法?

c++ - 鼠标事件点击坐标,好像我迷失在坐标集中

检查是否设置了特定位

c++ - 整数 |= 字符;操作忽略整数中的高位字节

java - 我正在使用运算符 |和 & 但没有得到正确的答案

c++ - 如何以最佳方式解决字母位置移动问题?

c++ - 创建没有夏令时的 boost::local_time::custom_time_zone

c - 二进制数的反转函数

c - C中的位域内存使用

c - 在C位中,乘以3除以16