我正在尝试将uint64_t
的低25位提取到uint32_t
。这个solution显示了如何从uint32_t
中提取低16位,但我无法找到uint64_t
。任何帮助将不胜感激。
答案 0 :(得分:3)
有关位操作,请参阅How do you set, clear, and toggle a single bit?。
回答你的问题:
uint64_t lower25Bits = inputValue & (uint64_t)0x1FFFFFF;
答案 1 :(得分:3)
用掩码掩盖,只留下你关心的部位。
uint32_t out = input & ((1UL<<26)-1);
这里的想法是:1UL<<26
提供一个(unsigned long
,保证至少32位宽)整数,只有第26位设置,即
00000100000000000000000000000000
-1使它成为一个低于它的所有位的值,即:
00000011111111111111111111111111
AND&#34;通过&#34;只有掩码中的位对应于零。
另一种方法是通过双移来丢弃这些位:
uint32_t out = (((uint32_t)input)<<7)>>7;
转换为uint32_t
确保我们处理的是32位宽的无符号整数; unsigned
部分对于通过移位(以及一般的按位运算)获得定义良好的结果很重要,32位宽的部分是因为我们需要一个具有已知大小的类型来使这个技巧起作用。
让我们说(uint32_t)input
是
11111111111111111111111111111111
我们左移32-25 = 7;这会丢掉前七位
11111111111111111111111110000000
然后我们将其右移:
00000001111111111111111111111111
然后我们去了,我们只得到了最后的25位。
请注意,第一个uint32_t
强制转换不是必需的,因为您已经拥有已知大小的无符号值;你可以做(input<<39)>>39
,但是(1)我更愿意确定 - 如果明天input
变成另一个大小/签名的类型会怎么样? (2)通常,当前的CPU使用32位整数比使用64位整数更有效。