gpt4 book ai didi

c++ - 如何在 64 位整数中的所有 '1' 之后快速设置 9 位

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:21:37 25 4
gpt4 key购买 nike

我正在编写一个 C++ 程序,需要一个函数在所有现有的“1”之后将所有 9 位设置为 1。

也就是说,我要编写一个函数 void set10BitsFull(int64_t& n) 用于整数 "int64_t n = 0b...1000000000... ",set10BitsFull(n)n 转换为“0b...1111111111...”。

(更新)输入整数的位被稀疏地设置为 1,并且两个 1 之间至少有 10 位距离。对于示例输入 0x20000200,预期输出为 0x3FF003FF 。最后一个1之后至少有9位0,最左边的10位永远为0。

这是我实现的这个功能

/**
* Inline function that set 10 bits to 1 after each set 1
* i.e.,
* ......1000000000...... -> ......1111111111.......
*
* @param n
* pointer of input number
*/
inline void set10BitFull(int_fast64_t *n) {
// n = 1000000000
*n |= (*n >> 1); // n = 1100000000
*n |= (*n >> 2) | (*n >> 4) | (*n >> 6) | (*n >> 8); // n = 1111111111
}

在程序的主循环中,这两行代码会被频繁调用,在之前的测试中,计算成本非常高。因此,我想寻求一种计算开销更少(计算的 cpu 周期更少)的方法,可能的解决方案可能包括:

  • 使用预先计算好的掩码
  • 内联汇编
  • x86/gcc 内置内在...

最佳答案

你可以这样做:

constexpr uint_fast64_t set10BitFull(uint_fast64_t n) {
return (n << 1) - (n >> 9);
}

这应该适用于您描述的所有输入,其中每 1 位后至少有 9 个 0 位。

关于c++ - 如何在 64 位整数中的所有 '1' 之后快速设置 9 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57001310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com