我试图从一个地址中删除(意味着该位为零)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);
}
答案 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
中的位移动到位置30
,30
移动到{{1 },...,和29
到1
,最低位被丢弃。它通常相当于整数除以2.如果这是你想要的,你应该得到它。