C 当我只有n^2时获取第n个数组元素的简单方法

C 当我只有n^2时获取第n个数组元素的简单方法,c,bit-manipulation,bit-shift,bitmask,C,Bit Manipulation,Bit Shift,Bitmask,我有一个由九个元素和一个整数组成的数组。 使用整数和位掩码,我想保存有关数组元素是否有效的信息 所以我的问题是:有没有比使用math.h的log2()更简单的方法从我的位掩码获取数组元素号? 例如,我使用位掩码将foo2、foo4和foo5存储在mValue中。 然后我想得到位置foo2=2处的数组元素,这是第二位,所以第二个数组元素是34。 但是我能想到的唯一方法是log2(n)function。 有没有一种更简单的使用位移位的方法 简单地说,我想这样做: 整数mValue的第n位是否设置为1

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

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

简单地说,我想这样做:

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

#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'
}
#包括
常量int foo1=1;
常量int foo2=2;
const int foo3=4;
const int foo4=8;
常数int foo5=16;
int bar[9]={23,34,82,8,7,0,23,19,20};
int值;
无效设置值(int nVal)
{
mValue=nVal;
}
bool IsElementValid(内部nVal)
{
返回mValue&nVal;
}
int main()
{
设定值(foo2 | foo4 | foo5);
IsElementValid(foo4);//true
IsElementValid(foo5);//true
IsElementValid(foo1);//false
//使用值foo2(2)访问数组元素1
如果(IsElementValid(foo2))
printf(“%d\n”,条[log2(foo2)];//输出:“34”
}
通常的习惯用法是:

if (mValue & (1<<n)) {
  return bar[n];
}
位位置
现在包含
值中最高设定位的位置
;如果
value=2^n
,则为
n


我想有更优雅和/或更快的方法(我不会让Intel或其他公司为这个创建汇编级命令),但我只会在必要时进一步优化这些东西。

if(mValue&(1谢谢!但这只有在我有
n
的情况下才会起作用。但我有的是
2^n
。当你只有nVal
2^n
(但是为什么?这没有任何意义,通常是很容易保持
n
的,或者你会扫描循环中的大部分位,在循环中保持索引也很容易):您可以检查编译器是否有位计数函数,例如gcc有
int\uuu builtin\u popcount(unsigned intx)
,因此
n=\uuuu builtin\u popcount(nVal-1);
@tzippy可能对您有用
if (mValue & (1<<n)) {
  printf("%d\n", bar[n]);
}
if (mValue & (1<<n)) {
  printf("%d\n", bar[n]);
}