(x & (x >> 1) == 0) 检查什么?

What does (x & (x >> 1) == 0) check for?

我在一个大型代码库中看到了这个语句,我不知道这个使用位操作的检查是干什么用的。这是位操作中的一些标准技巧吗?如果有,它在寻找什么?

我知道在二进制中,x >> 1x 的所有位都移到正确的 1 位,因此使用 x 将保证 [= 的最大设置位11=] 变为零。但是我就是不明白这个检查的目的。

(x & (x >> 1)) == 0(为安全添加额外的括号)检查 x 中是否有相邻的设置位,如果没有则计算为 true

例如:

10101010 -> true
00010000 -> true
00000011 -> false
10100110 -> false