C 当我只有n^2时获取第n个数组元素的简单方法
我有一个由九个元素和一个整数组成的数组。 使用整数和位掩码,我想保存有关数组元素是否有效的信息 所以我的问题是:有没有比使用math.h的log2()更简单的方法从我的位掩码获取数组元素号? 例如,我使用位掩码将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
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
。当你只有nVal2^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]);
}