我知道指针增加了sizeof(type_i_am_using)返回的字节数。但是,无论如何都要逐位使指针递增?
答案 0 :(得分:3)
但是,无论如何都要逐位增加指针?
如果你的意思是"逐字节":不,因为有一种叫做对齐的东西。未对齐的地址不能是有效对象的地址,因此包含未对齐地址的指针无效。大多数具有无效指针的操作都会调用未定义的行为。如果你想要,例如访问标准布局类的数组子对象,其中该数组是第一个成员,将指针强制转换为数组的元素类型并从那里开始工作。你描述的内容没有直接的意义。
如果你的意思是逐字逐句":有一些众所周知的方法可以使用简单的for
循环迭代对象表示中的所有位。
答案 1 :(得分:1)
大多数计算机体系结构都不允许您处理单个位。如果你需要,比如迭代一系列的比特,你需要迭代字节(使用char *
或指向更大的无符号整数类型的指针)并通过位移和位提取位掩码操作。 (value >> x) & 1
将从右侧提取索引x
的位; value |= 1 << x
会将其设置为1,value &= ~(1 << x)
会将其设置为0.
请注意,vector<bool>
专门用于将其值打包为单个位。
答案 2 :(得分:1)
指针不能逐位递增,因为char是可寻址存储器的最小量。这是语言规范中的强制要求。如果你需要开始查看单个位,那么你很可能会想要使用位移/屏蔽操作。
例如,要查看角色,您可能需要执行以下操作:
bool get_bit_n(unsigned int n, char x){
return (1 << n) & x
}
您也可以查看std::bitset
。
答案 3 :(得分:0)
没有。字符是机器可以解决的最小的问题。但是,您可以使用位操作遍历机器中的所有位。在C ++中,您可以使用std::bitset
或std::vector<bool>
专门化或位字段。