我想修改单个数据位(例如int
或char
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...
}
答案 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 ++就是这样,不知道“位”。您可以构建自己的类型,为此,您需要两件事:指向某种类型的指针(char
,int
- 可能是无符号的)和位数。然后,您可以使用指针和位数以及按位运算符来实际访问这些值。
答案 4 :(得分:0)
没有什么比指向
的指针更像了如果你想将所有位设置为1,那么c = 0xff;
就是你想要的,如果你想在某种条件下设置一个位:
for(index;index<8;index++)
{
if (condition) c |= 1 << index;
}
如您所见,无需使用指针
答案 5 :(得分:0)
您无法从内存中读取单个位,CPU始终会读取完整的缓存行,该缓存行可能具有不同CPU的不同大小。
但从语言的角度来看,你可以使用位字段