逐位递增指针

时间:2014-11-26 19:31:03

标签: c++ c pointers

我知道指针增加了sizeof(type_i_am_using)返回的字节数。但是,无论如何都要逐位使指针递增?

4 个答案:

答案 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::bitsetstd::vector<bool>专门化或位字段。