将指针的最低有效位设置为0

时间:2015-03-07 12:30:59

标签: c pointers bit-manipulation

我有一个size_t *变量,我想将最低有效位设置为0.因为它从1开始,我尝试了以下方法。

size_t * next_chunk = stack_mem.start;
int n = (int)next_chunk;
n ^= 1 << 1;
next_chunk = (size_t)n;

这可能是非常错误的。

4 个答案:

答案 0 :(得分:3)

首先,您必须确保使用与指针大小相同的整数类型。在大多数64位平台上,int为32位,指针为64位,因此在转换为int时,您将损坏指针。除了一些奇特的记忆模型外,size_t通常可以胜任。

然后我建议使用一个允许在没有任何强制转换的情况下修改指针位的联合:

union {
    size_t *pointer;
    size_t  integer;
} u;

u.pointer = next_chunk;
u.integer &= ~1;
next_chunk = u.pointer;

正如其他人已经注意到的那样,你可以通过ANDing来清除整数位,并使用按位否定位模式,在最小有效位的情况下为1。

答案 1 :(得分:1)

尝试以下

n &= ~0 << 1;

另一种方式是

n = ( ( unsigned int )n >> 1 ) << 1;

考虑到将指针转换为int类型的对象是不安全的。

如果您要设置指针指向的对象的最低有效位,则操作将如下所示

*next_chunk &= ~0 << 1
*next_chunk = ( *next_chunk >> 1 ) << 1;

答案 2 :(得分:1)

你真的确定要取消内存中某个地方最低位的地址吗?我想,你想用位于有这个地址的地方的值来做到这一点。也许,你需要

size_t * next_chunk = stack_mem.start;
*next_chunk &= ~0 << 1;

UPD:在所有概率下,指针值(即存储器地址)将被对齐,换句话说,它具有等于零的最后一位或两位。

UPD2:要自己进行对齐,需要在第二行开头删除星号

size_t * next_chunk = stack_mem.start;
next_chunk &= ~0 << 1;

答案 3 :(得分:1)

从位位置1到值0的最低有效位设置如下:

n &= ~((0x01) << 1)

我认为相关代码段中的代码未正确使用。