为什么不能对C中的指针进行按位操作,有没有办法解决这个问题?

时间:2013-04-07 21:54:37

标签: c++ c pointers bit-manipulation

我读到你不能用指针做bitmasks,你怎么也做不到 对指针的按位操作?

有没有办法达到同样的效果?

这同样适用于C ++吗?

3 个答案:

答案 0 :(得分:18)

你不能做按位指针操作的原因是因为标准说你做不到。我认为标准之所以这样说是因为按位指针操作几乎普遍会导致未定义或(最好)实现定义的行为。所以你可以做的就是有用的便携式,这与简单的添加操作不同。

但你可以通过演员来解决这个问题:

#include <stdint.h>

void *ptr1;
// Find page start
void *ptr2 = (void *) ((uintptr_t) ptr1 & ~(uintptr_t) 0xfff)

至于C ++,只需使用reinterpret_cast而不是C风格的演员表。

答案 1 :(得分:6)

这是不允许的,因为语义并没有真正明确定义。不过你当然可以做到。只需转换为uintptr_t,执行操作然后转换回指针类型。这也适用于C ++。

答案 2 :(得分:4)

你不能在指针上使用按位运算符,因为标准对如何表示指针以及任何特定指针可以处理的值的范围提出了很少的要求。因此,没有定义在指针上使用这些运算符意味着什么。

尽管如此,大多数机器上的大多数编译器都使用明显的内存地址映射作为指针的值。其中大多数都会让你指向一个整数类型的指针。然后,您可以对该值执行按位运算,甚至将其转换回指针。但这不是严格的便携式或一般的明确定义。