【发布时间】:2014-06-12 19:27:11
【问题描述】:
我对位操作有点陌生。我正在尝试将信息存储在 int64_t 变量中,如下所示:
int64_t u = 0;
for(i=0;i<44;i++)
u |= 1 << i;
for(;i<64;i++)
u |= 0 << i;
int t = __builtin_popcountl(u);
我的意图是将 44 个 1 存储在变量 u 中,并确保剩余位置均为 0,因此“t”返回 44。但是,它始终返回 64。对于其他变量,例如int32,它也失败了。为什么?
【问题讨论】:
-
虽然第二个循环不会造成任何麻烦(那是因为它根本没有用处),
u |= 0 << i;不是清除(设置为零)@987654323 的正确方法@th 位。您应该执行类似u &= ~(1 << i);的操作来清除u的ith 位。1 << i将1向左移动i,然后~将反转整个事情。anding 将清除0所在的位,这将是ith 位,1在反转之前。 -
在第二个循环中,任何
|0 都只是原始值。即,无论i的值如何,u |= 0 << i使u完全不变。 -
在这种情况下,第一个循环会自行解决问题,不是吗?
-
u = (1u << 44) -1;(你不需要循环) -
不,IIRC 你不需要 sizecast 1u 或 1ul 或 1ull 常量。 (也许如果它们超过本机机器寄存器大小)。无论如何,
u = (1ull << 44) -1;可以。 @KeithThomson 下面有正确答案。
标签: c bit-manipulation bit bit-shift bitwise-or