作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑 this link来自 Bit Twiddling Hacks 网站。为了计算尾随位,使用了以下算法:
unsigned int v; // 32-bit word input to count zero bits on right
unsigned int c = 32; // c will be the number of zero bits on the right
v &= -signed(v); /* THIS LINE */
if (v) c--;
if (v & 0x0000FFFF) c -= 16;
if (v & 0x00FF00FF) c -= 8;
if (v & 0x0F0F0F0F) c -= 4;
if (v & 0x33333333) c -= 2;
if (v & 0x55555555) c -= 1;
谁能解释一下标记为 /* THIS LINE */
的行的作用,更重要的是,是否可以仅使用按位运算来避免使用 signed()
?
编辑:如何用算术/逻辑/按位运算替换signed()
?
最佳答案
v &= -signed(v)
将清除 v 的最低设置位(1
-bit)以外的所有位,即从 v 中提取最低有效 1 位(v 之后会变成一个 2 的幂数)。例如,对于 v=14 (1110)
,在此之后,我们有 v=2 (0010)
。
在这里,使用 signed()
是因为 v 是 unsigned
并且您试图取反 unsigned
值(给出编译错误VS2012)(来自 JoelRondeau 的评论)。或者您将收到如下警告:warning C4146: unary minus operator applied to unsigned type, result still unsigned
(我的测试)。
关于c++ - 并行计算右侧连续的零位(尾随) : an explanation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21299354/
我是一名优秀的程序员,十分优秀!