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位的计数器变量.位变量在某个元素中计数有多少位.
谢谢您的帮助.
如果你真的想要一个宏,我可能会做这样的事情:
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如果需要,定义应该是一个明显的扩展.
但是,这样做一个小的内联函数会更安全,更好的解决方案......
还有这个,它有一个关于如何以各种方式获得"人口数量"的整个部分......
| 归档时间: |
|
| 查看次数: |
1402 次 |
| 最近记录: |