我正在尝试用bithifts加速程序.为此,我为存储的位分配了一些空间.
现在我必须将中间位设置为1.所以例如我想要:
000000.1亿
在我的记忆中.(长度由用户在运行时定义).
这是我的代码:
int *state = malloc(b); // Where 'b' is a user defnied value
*state |= (1 << b);
Run Code Online (Sandbox Code Playgroud)
但是当我打印出这些位时,我会得到类似的东西(对于b = 10):
000000000010000000000000000000000000000000100000000000000000000000000000001000000000000000000000000
因此它会在中间放置许多1而不是1.
我在这做错了什么?
我相信它与我使用int有关,也许解决方法是不使用int.但我不知道如何以另一种方式分配比特阵.
这是我打印位的方式(请求在注释中):
64 for(i =0; i < b; i++){
65 printf("%d", ((*state & (1 << i)) >> i));
66 }
Run Code Online (Sandbox Code Playgroud)
你正在混合位和字节.
要分配b位,你需要
int *state = malloc(sizeof(int)*((b+sizeof(int)-1)/sizeof(int))); // Where 'b' is a user defnied value
Run Code Online (Sandbox Code Playgroud)
要在此数组中设置一个位,请分解为int位置和位位置:
state[b/sizeof(int)] |= (1 << (b % sizeof(int)));
Run Code Online (Sandbox Code Playgroud)
如果要使用单个位,则可能更容易使用unsigned char而不是int作为基本数组.
编辑:刚刚更改了分配(b+sizeof(int)-1)/sizeof(int)- 这会计算所需的字节大小.当然,您需要为int大小的成员分配空间,因此分配的内存大小是字节数的倍数sizeof(int).