【问题标题】:Simple way of getting the nth array element when all I have is n^2当我只有 n^2 时获取第 n 个数组元素的简单方法
【发布时间】:2016-07-11 15:01:54
【问题描述】:

我有一个由九个元素和一个整数组成的数组。 使用整数和位掩码,我想保存有关数组元素是否有效的信息。

所以我的问题是:有没有比使用 math.h 的 log2() 从我的位掩码获取数组元素编号更简单的方法? 例如,我使用位掩码将foo2, foo4foo5 存储在mValue 中。 然后我想得到位置foo2 = 2的数组元素,也就是第二位,所以第二个数组元素,就是34。 但我能想到的唯一方法是log2(n) 功能。 有没有更简单的使用位移的方法?

简单地说,我想这样做:

整数mValue的第n位是否设置为1?然后给我数组bar的第n个元素。

#include <math.h>  

const int  foo1 = 1;
const int  foo2 = 2;
const int  foo3 = 4;
const int  foo4 = 8;
const int  foo5 = 16;

int bar[9] = {23,34,82,8,7,0,23,19,20};
int mValue;

void SetValue(int nVal)
{
 mValue = nVal; 
}

bool IsElementValid(int nVal)
{
 return mValue & nVal;
}

int main()
{
 SetValue(foo2 | foo4 | foo5 );
 IsElementValid(foo4); //true
 IsElementValid(foo5); //true
 IsElementValid(foo1); //false

 //access array element 1 with value foo2 (2)
 if(IsElementValid(foo2))
    printf("%d\n",     bar[log2(foo2)]); // output: '34'
}

【问题讨论】:

标签: c bit-manipulation bit-shift bitmask


【解决方案1】:

通常的成语是:

if (mValue & (1<<n)) {
  return bar[n];
}

编辑:但如果你唯一真正拥有的是2^n(并且你无法改变你的逻辑),你仍然可以避免对log2 的昂贵(和双重/浮动)调用:

int bit_pos=0;
unsigned int value = ...;   // your input

while (value>1) {
  value >>= 1;
  bit_pos++;
}

bit_pos 现在包含value 中最高设置位的位置;如果value=2^n,则为n

我想还有更优雅和/甚至更快的方法(我不会让英特尔或其他公司为此创建汇编程序级别的命令),但我只会在必要时进一步优化这些东西。

【讨论】:

  • 谢谢!但这只有在我有n 时才有效。但我拥有的是2^n
  • 当你只有 nVal 2^n 时(但是为什么?这没有任何意义,通常很容易将 n 保留在周围,否则你将扫描大部分位一个循环,再次保持索引很容易):您可以检查您的编译器是否具有位计数功能,例如 gcc 有int __builtin_popcount (unsigned int x),那么n = __builtin_popcount (nVal-1); @tzippy
【解决方案2】:
if (mValue & (1<<n)) {
  printf("%d\n", bar[n]);
}

我对小玩意还很陌生,但这可能行得通吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2011-08-06
    • 2020-07-21
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多