从c中的地址中删除LSB

时间:2014-07-30 17:00:17

标签: c bit-manipulation

我试图从一个地址中删除(意味着该位为零)LSB。我写的下面的代码似乎没有做我打算做的事情。

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
struct node
{
    unsigned long key;
    struct node* child[2];
};
int main()
{
    struct node* node = (struct node*) malloc(sizeof(struct node));
    printf("%x\n",node);
    node = (struct node*)((uintptr_t) node >> 1UL);
    printf("%x\n",node);
}

3 个答案:

答案 0 :(得分:3)

如果要清除最低有效位,可以使用:

(struct node*)((uintptr_t) node & (UINTPTR_MAX << 1))

但不要将结果分配给node,否则会导致内存泄漏。

答案 1 :(得分:1)

如果您想使用移位操作符(如ouah的答案中的评论所示),您可以使用:

(struct node*)(((uintptr_t)node >> 1) << 1)

答案 2 :(得分:1)

如果您的意图是将值的低位置为零,则可以使用如下表达式:

x = z & ~1; // assuming x, y, and 1 are of the same bit width

这补充1,将其转换为0b111111...1110,并执行值为AND的按位z。效果是最低位设置为0,而所有其他位保留其值。

您使用的表达式node >> 1UL执行移位 - 也就是说,位置31中的位移动到位置3030移动到{{1 },...,和291,最低位被丢弃。它通常相当于整数除以2.如果这是你想要的,你应该得到它。