代码之家  ›  专栏  ›  技术社区  ›  Kaidul

整数的反位[重复]

  •  1
  • Kaidul  · 技术社区  · 6 年前

    我通过了一个面试问题。反转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;
    }
    

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

    1 回复  |  直到 6 年前
        1
  •  4
  •   Mayur    6 年前

    可以使用反向查找表优化循环。
    有关更多详细信息,请关注 this 我从下面的代码采取的网址。

    // 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;
    }