gpt4 book ai didi

c++ - 并行计算右侧连续的零位(尾随) : an explanation?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:43 28 4
gpt4 key购买 nike

考虑 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com