【发布时间】:2023-03-11 08:21:01
【问题描述】:
基本上,我想要的是在无符号 64 位 int 内部(在最右边的 32 位中)“存储”一个带符号的 32 位 int - 因为我想将最左边的 32 位用于其他目的。
我现在正在做的是一个简单的演员表和面具:
#define packInt32(X) ((uint64_t)X | INT_MASK)
但是这种方法有一个明显的问题:如果X 是一个正整数(第一位没有设置),一切都很好。如果它是负面的,它就会变得混乱。
问题是:
如何以最快和最有效的方式实现上述,同时支持负数?
【问题讨论】:
-
我不知道这是否是最快最有效的方式,但一种方式应该是
#define packInt32(X) (((uint64_t)X & UINT32_MAX) | INT_MASK) -
什么是
INT_MASK?你应该如何处理按位或INT_MASK?也许您打算将按位 and 与INT_MASK一起使用? -
@Someprogrammerdude 它设置了一些标识符位。
-
那么从技术上讲,它并不是真正的面具。掩码是您按位执行的操作,用于删除不需要的位。这就是您想要的(删除可能符号扩展值的高 32 位)。
-
旁白:您真的应该在宏替换文本中的
X周围添加括号。
标签: c bit-manipulation int32