我正在学习c。作为实验,我试图实现128位加法和乘法。
我想使用void指针执行此操作,如下所示:
void* x = malloc(16);
memset(x, 0, 16);
是否可以读取和写入x的第i位?我理解如何使用标准数据类型的按位运算来执行此操作,但是当我尝试对void指针使用按位运算时,编译器会抱怨无效的操作数。一般来说,我感兴趣的是,是否有可能对任意大小的内存块进行malloc,然后在c中操作每个单独的位?
答案 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))