6

我想修改单个数据位(例如ints 或chars)。我想通过制作一个指针来做到这一点,比如说ptr。通过将其分配给某个 int 或 char,然后在递增ptrn 次后,我想访问该数据的第 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...
}
4

6 回答 6

7

C++ 中没有位指针之类的东西。您需要使用两件事,一个字节指针和一个位偏移量。这似乎是您在代码中的目标。以下是您如何执行各个位操作。

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

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

// test a bit
if (*ptr & (1 << index))
    ...
于 2013-04-06T07:39:11.817 回答
1

C 和 C++ 中最小的可寻址内存单元是 1 个字节。所以你不能有一个指向任何小于一个字节的指针。如果你想执行按位操作,C 和 C++ 为这些操作提供按位运算符

于 2013-04-06T07:39:02.420 回答
1

不可能有单个位的地址,但您可以使用具有位域的结构。就像在维基百科的这个例子中一样:

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。从技术上讲,这与按位运算相同,但在这种情况下,编译器将生成代码(并且您出现错误的可能性较低)。

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

于 2013-04-06T07:45:23.747 回答
1

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

于 2013-04-06T07:49:14.000 回答
0

没有什么能比得上指向位的指针

如果您希望将所有位设置为 1,那么c = 0xff;这就是您想要的,如果您想在某些条件下设置位:

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

如您所见,无需使用指针

于 2013-04-06T07:48:50.587 回答
0

你不能从内存中读取一个位,CPU 总是读取一个完整的缓存行,对于不同的 CPU 可能有不同的大小。

但是从语言的角度来看,您可以使用位域

于 2013-04-06T07:49:47.277 回答