使用void指针在c中存储128位数

时间:2016-03-16 08:03:01

标签: c

我正在学习c。作为实验,我试图实现128位加法和乘法。

我想使用void指针执行此操作,如下所示:

void* x = malloc(16);
memset(x, 0, 16);

是否可以读取和写入x的第i位?我理解如何使用标准数据类型的按位运算来执行此操作,但是当我尝试对void指针使用按位运算时,编译器会抱怨无效的操作数。一般来说,我感兴趣的是,是否有可能对任意大小的内存块进行malloc,然后在c中操作每个单独的位?

2 个答案:

答案 0 :(得分:9)

当涉及到指针类型的转换时,C标准令人惊讶地(虽然逻辑上)不灵活,尽管您可以将malloc的结果转换为您想要的任何指针类型。

为了执行位和字节分析,要使用的安全类型为char*unsigned char*

unsigned char* x = malloc(16);

(我总是选择unsigned char,因为有些平台有一个1的补码签名char类型,粗略地说,这是一个痛苦的问题。)

然后,您可以在x上使用指针算术来逐字节地操作内存块。请注意,标准声明sizeof(char)sizeof(unsigned char)为1,因此对这种类型的指针运算将遍历整个内存块而不会遗漏任何位。

对于逐位检查,标准定义的CHAR_BIT将告诉您一个字节中有多少位。 (通常是8,但假设这是不明智的。)

最后,不要忘记在某个时候致电free(x)

答案 1 :(得分:2)

在位置i

设置位
*((uint8_t*)x + i/8) |= (1 << (i%8))

清除它

*((uint8_t*)x + i/8) &= ~(1 << (i%8))