一个宏来计算打开的位(设置)

Ass*_*saf 1 c bit-manipulation bit-shift

我的任务是编写一个宏来检查INT数组中有多少元素已经激活了5位.

我知道宏是一种非常冒险的方式,但这是一些考试中出现的问题.

这是我的代码:

#include <stdio.h>
#define RESULT 5
#define SIZE 8
#define BITW(arr, length, counter)\
    int mask=0b00000001, bits=0, i=0, j=0;\
    for (i=0; i<length; i++){\
        for (j=0; j<sizeof(arr[i])*SIZE; j++){\
            if(mask&arr[i]>>j)\
                bits++;\
        }\
        if (bits==RESULT)\
            counter++;\
    }
int main(void){
    int arr[4]={0b11111000,0b11100011,0b11001100,0b11000000};
    int res=0; int counter=0;
    BITW(arr, 4, counter);
    printf("%d",counter);


}
Run Code Online (Sandbox Code Playgroud)

宏的问题是我无法调试我的代码.我几次没有成功,但我意识到我得到的结果是1而不是2.

计数器变量是计算有多少元素有5位的计数器变量.位变量在某个元素中计数有多少位.

谢谢您的帮助.

twa*_*erg 7

如果你真的想要一个宏,我可能会做这样的事情:

static const int bits_per_nibble[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
#define BITS_PER_U8(x) (bits_per_nibble[(x) & 0xf] + bits_per_nibble[((x) >> 4) & 0xf])
#define BITS_PER_U16(x) (BITS_PER_U8((x) & 0xff) + BITS_PER_U8(((x) >> 8) & 0xff))
#define BITS_PER_U32(x) (BITS_PER_U16((x) & 0xffff) + BITS_PER_U16(((x) >> 16) & 0xffff))
Run Code Online (Sandbox Code Playgroud)

BITS_PER_U64如果需要,定义应该是一个明显的扩展.

但是,这样做一个小的内联函数会更安全,更好的解决方案......

还有这个,它有一个关于如何以各种方式获得"人口数量"的整个部分......