C / C ++指针类型指向单个位?

时间:2013-04-06 07:35:35

标签: c++ c pointers

我想修改单个数据位(例如intchar s)。我想通过制作一个指针来做到这一点,比如ptr。通过将其分配给某个int或char,然后在递增ptr n次之后,我想访问该数据的第n位。     像

这样的东西
// If i want to change all the 8 bits in a char variable
char c="A";
T *ptr=&c; //T is the data type of pointer I want..
int index=0;
for(index;index<8;index++)
{
    *ptr=1;  //Something like assigning 1 to the bit pointed by ptr...
}

6 个答案:

答案 0 :(得分:5)

C ++中没有位指针。你需要使用两个东西,一个字节指针和一个偏移量。这似乎是你在代码中所面对的。以下是您执行单个位操作的方法。

// set a bit
*ptr |= 1 << index;

// clear a bit
*ptr &= ~(1 << index);

// test a bit
if (*ptr & (1 << index))
    ...

答案 1 :(得分:1)

C和C ++中最小的可寻址存储单元是1个字节。因此,您不能指向任何小于一个字节的指针。如果您想执行按位运算,C和C ++会为这些操作提供 bitwise operators

答案 2 :(得分:1)

不可能有单个位的地址,但可以使用具有位字段的结构。就像在这个例子中Wikipedia所以:

struct box_props
{
     unsigned int opaque       : 1;
     unsigned int fill_color   : 3;
     unsigned int              : 4; // fill to 8 bits
     unsigned int show_border  : 1;
     unsigned int border_color : 3;
     unsigned int border_style : 2;
     unsigned int              : 2; // fill to 16 bits
};

然后通过操纵单个字段,您将更改unsigned int内的位组。从技术上讲,这与按位运算相同,但在这种情况下,编译器将生成代码(并且您有更低的bug机会)。

请注意,您必须谨慎使用位字段。

答案 3 :(得分:1)

C和C ++没有“位指针”,从技术上讲,C和C ++就是这样,不知道“位”。您可以构建自己的类型,为此,您需要两件事:指向某种类型的指针(charint - 可能是无符号的)和位数。然后,您可以使用指针和位数以及按位运算符来实际访问这些值。

答案 4 :(得分:0)

没有什么比指向

的指针更像了

如果你想将所有位设置为1,那么c = 0xff;就是你想要的,如果你想在某种条件下设置一个位:

for(index;index<8;index++)
{
    if (condition) c |= 1 << index;
}

如您所见,无需使用指针

答案 5 :(得分:0)

您无法从内存中读取单个位,CPU始终会读取完整的缓存行,该缓存行可能具有不同CPU的不同大小。

但从语言的角度来看,你可以使用位字段