zoukankan      html  css  js  c++  java
  • 取最小的比n大的2的幂

    是不是很拗口?
    判断一个数n是否是2的幂,只要看n&(n-1)是不是0就行了。
    而找比它大的2的幂,可以先把它最高的一个1位之后全填充1然后加1。
    填充的方法可以是log32 = 5次的按位或。这样就不必做判断而出现分支了。
    也许有更快更好的方法吧,借此抛砖引玉一把。

    #include <cstdio>
    inline 
    bool is_power_of_2(int n)
    {
        
    return (n & (n-1)) == 0;
    }

    inline 
    int min_power_of_2_g(int n)
    {
        
    //return n |= n>>16, n |= n>>8, n |= n>>4, n |= n>>2, n |= n>>1, n + 1; 其实是一样的,显得短一些而已
        return ((((n |= n>>16|= n>>8|= n>>4|= n>>2|= n>>1, n + 1;
    }

    inline 
    int min_power_of_2_eg(int n)
    {
        
    if (is_power_of_2(n))
            
    return n;
        
    return min_power_of_2_g(n);
    }


    int main()
    {
        
    int n;
        
    while(scanf("%d"&n) == 1)
        
    {
            n 
    = min_power_of_2_eg(n);
            printf(
    "%x %d\n", n, n);
        }

        
    return 0;
    }

    /*这里是vc6 release生成的代码:
    mov ecx,dword ptr [esp]    ; 取出n
    mov eax,ecx
    lea edx,[ecx-1]    ;n-1
    test ecx,edx         ; n & (n-1)
    je END1
    sar eax,10h   ; n |= n>>16
    or eax,ecx
    mov ecx,eax
    sar ecx,8   ; n |= n>>8
    or eax,ecx
    mov edx,eax
    sar edx,4  ; n |= n>>4
    or eax,edx
    mov ecx,eax
    sar ecx,2  ; n |= n>>2
    or eax,ecx
    mov edx,eax
    sar edx,1  ; n |= n>>1
    or eax,edx
    inc eax    ; 最后加1
    END1:
    */

  • 相关阅读:
    RSS简易阅读器vb.net源代码
    [建议]有关图片地址的建议
    [音乐欣赏]wind flowers
    有个叫计算机的比我笨
    一个朋友画的建筑设计手绘图与其想到的
    [推荐]华建小翻--QQ里的一个不错的服务商
    爆强的广告
    [学习日记]重构简易RSSREADER的UML类图
    [音乐欣赏]红颜
    [音乐欣赏]花与琴的流星
  • 原文地址:https://www.cnblogs.com/kaikai/p/251925.html
Copyright © 2011-2022 走看看