如何使用位操作得到大于N且為2的次方的最小的數
RT,比如輸入10返回16, 輸入24返回32,等等.
注意,是使用位操作且沒有循環,也不用表驅動等等.因為這個操作要經常進行,要保證高效,所以不能使用循環(別跟我說用遞歸,熟悉算法和計算機本質的人都知道遞歸和循環本質是一樣的:);同時,因為不知道需要計算的數據到底有多大,采用表驅動的辦法也不可行.
我在網上發帖,最終得到了一個很BT的答案:
但是我不知道這個算法的原理是什么,貌似采用了浮點數格式的一些特性,知道的同學請給我一個詳盡的解釋,在這里先感謝了.
注意,是使用位操作且沒有循環,也不用表驅動等等.因為這個操作要經常進行,要保證高效,所以不能使用循環(別跟我說用遞歸,熟悉算法和計算機本質的人都知道遞歸和循環本質是一樣的:);同時,因為不知道需要計算的數據到底有多大,采用表驅動的辦法也不可行.
我在網上發帖,最終得到了一個很BT的答案:
int fun(int v)
{
float f = (float)(v - 1);
return 1 << ((*(unsigned int*)(&f) >> 23) - 126);
}
{
float f = (float)(v - 1);
return 1 << ((*(unsigned int*)(&f) >> 23) - 126);
}
但是我不知道這個算法的原理是什么,貌似采用了浮點數格式的一些特性,知道的同學請給我一個詳盡的解釋,在這里先感謝了.
posted on 2008-06-21 15:36 那誰 閱讀(4783) 評論(10) 編輯 收藏 引用 所屬分類: C\C++ 、算法與數據結構