C bitarray设定值

use*_*092 0 c bit-shift

我正在尝试用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)

usr*_*301 6

你正在混合位和字节.

要分配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).