有效地计算前导零?查找最高设置位的位置

问题描述 投票:1回答:1

在我的代码中,我发现处理器大部分时间都花在下面显示的功能上。循环的目的是应找出满足循环内部条件的val1值。变量Val1和a的类型为long long int(64位)。而且,它们是在函数内部声明的局部非静态变量。

long long int findval(long long int x)
{

  long long int Val1,a=x;

  for (Val1 = 63; Val1 > 22; Val1--) 
  {
        if (((a >> Val1) & 1) == 1) 
            break;
  }

  return Val1;
}

还有其他简单/优化的方法来找出Val1值吗?

c optimization bit-manipulation simd fixed-point
1个回答
1
投票

首先,请记住,只是因为您发现处理器大部分时间都在该function代码段上,但这并不意味着该代码段存在问题。也许您应该尝试找出为什么您的代码如此频繁地调用该代码段的原因。

[第二,既然您来这里寻求帮助,您不妨向我们展示您拥有的一切,而不是向您展示您拥有的一切的子集,您认为这些子集应该足以让我们找出问题所在。最重要的是,您确实应该向我们确切说明如何声明变量] >>,以及确切地声明变量的位置。它们是局部函数吗?他们是static吗?可能是您声明了volatile吗?没有什么不相关,一切都很重要。

无论如何,如果我们假设可以优化代码段,那么我会说以下内容:

您的Val1应该不是

long long int,因为它的值仅在23到63之间。因此,它应该是int

((由于某种原因Val1 must

被计算为long long int,然后尝试将其强制转换为另一个在循环之前为int类型的变量,并在循环中使用该变量循环。)

[如果您尝试这样做,则编译器可能会发现,您要尝试做的是找到一个位范围内的第一个非零位,然后用一条机器指令替换整个循环。

© www.soinside.com 2019 - 2024. All rights reserved.