【问题标题】:Reverse bits of an integer [duplicate]整数的反转位[重复]
【发布时间】:2018-09-25 21:04:56
【问题描述】:

我是通过一个面试问题来的。反转 32 位无符号整数的位。我写的这段代码完全没问题:

uint32_t reverseBits(uint32_t n) {
    for(int i = 0, j = 31; i < j; i++, j--) {
        bool iSet = (bool)(n & (1 << i));
        bool jSet = (bool)(n & (1 << j));
        n &= ~(1 << j);
        n &= ~(1 << i);
        if(iSet) n |= (1 << j);
        if(jSet) n |= (1 << i);
    }
    return n;
}

在此之后,有一个后续问题 - 如果多次调用此函数,您将如何优化它?我不知道在那种情况下应该如何优化解决方案。

【问题讨论】:

  • 必须链接到Bit Twiddling Hacks
  • 您认为可以改进的工作代码?这看起来像是 Coooooooode Review! 的工作我已链接到如何提问页面,因为值得一读以确保您发布的任何帖子都符合他们的要求。

标签: c++ algorithm bit-manipulation


【解决方案1】:

您可以使用反向查找表来优化循环。
有关更多详细信息,您可以关注this URL,我从中获取了以下代码。

// Generate a lookup table for 32bit operating system 
// using macro 
#define R2(n)     n,     n + 2*64,     n + 1*64,     n + 3*64
#define R4(n) R2(n), R2(n + 2*16), R2(n + 1*16), R2(n + 3*16)
#define R6(n) R4(n), R4(n + 2*4 ), R4(n + 1*4 ), R4(n + 3*4 )

// Lookup table that store the reverse of each table
unsigned int lookuptable[256] = { R6(0), R6(2), R6(1), R6(3) };

/* Function to reverse bits of num */
int reverseBits(unsigned int num)
{
    int reverse_num = 0;

     // Reverse and then rearrange 

                   // first chunk of 8 bits from right
     reverse_num = lookuptable[ num & 0xff ]<<24 | 

                   // second chunk of 8 bits from  right 
                   lookuptable[ (num >> 8) & 0xff ]<<16 | 

                   lookuptable[ (num >> 16 )& 0xff ]<< 8 |
                   lookuptable[ (num >>24 ) & 0xff ] ;

    return reverse_num;
}

【讨论】:

  • 你应该提到这个来源。
  • 嗨@m69 我已经添加了源代码。
  • GeeksforGeeks 自己似乎从@zch 发布的链接中复制了它,没有提及这一点:-) graphics.stanford.edu/~seander/bithacks.html#BitReverseTable
  • @m69 感谢您提供真实来源,我已经更新了来源网址。
  • @m69 极客网站确实引用了源代码,但仅在同一主题的 previous post 上引用。
猜你喜欢
  • 2015-09-17
  • 2011-06-15
  • 1970-01-01
  • 2017-11-18
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
相关资源
最近更新 更多