求最接近的最大2的指数次幂roundup_pow_of_two分析与实现
来源:互联网 发布:黑客编程入门3pdf 编辑:程序博客网 时间:2024/05/21 06:13
思想很简单,就是找出当前数的二级制中最大位为1位的位置,然后用1左移位数即可。
比如数据5,它的二进制形式为101,最高位为1的位置是3,然后左移3位,等于1000,即数字8。也就是数字8是5的接近的2的整数次幂。
思想很简单,最主要的任务就是找到最高位为1的位置。这个有专门的AT&T汇编指令bsrl。这个指令是个32位指令,位置范围是0到31。
如果bsrl %eax 5的范围结果是2,所以我们在用它的时候加1即可。当然0是需要考虑的,我们把它的值赋值成-1,这样函数结果的范围就编程1到32。具体实现如下:
static inline int fls(int x)
{
int r;
__asm__("bsrl %1,%0\n\t"
"jnz 1f\n\t"
"movl $-1,%0\n"
"1:" : "=r" (r) : "rm" (x));
return r+1;
}
当然,如果不用汇编也是可以实现的,我们用C语言来实现它。就是不断左移,直到数值为0,记下它左移的次数,既是它最高位为1的位置。
static inline int fls(int x)
{
int position;
int i;
if(0 != x)
{
for (i = (x >> 1), position = 0; i != 0; ++position)
i >>= 1;
}
else
{
position = -1;
}
return position+1;
}
最后把要得到的数字用1左移那么多次数,即可。考虑到0的特殊性,我们把数字都减1,其他都不会受影响,这样0会取值成-1,然后取到的位置为32,1左移32位后还是为0。
实现代码如下:
static inline unsigned int roundup_pow_of_two(unsigned int x)
{
return 1UL << fls(x - 1);
}
- 求最接近的最大2的指数次幂roundup_pow_of_two分析与实现
- 判断是否是2的指数次幂
- 求指数的方法
- 【数据结构与算法分析】2.3 求X的N次幂
- Map中提供的一个算法(提供一个值,返回大于等于该值的最接近的2的指数幂)
- 求一个数的2次幂
- 统计数字(求最接近的两个数字)
- 穷举法求最接近的真分数
- 求100以内的指数
- 《ACM程序设计》-Problem-T-最接近一个数的给定的幂次的底数
- 编程实现返回不大于某值的最大的2次幂
- 第7周 数据结构与算法分析 2-8求最大子序列的函数
- chrome的base库中求最接近n的2的多少次幂,也就是k=log2(n); 求k的算法
- 求无序数组中三个元素相加与目标数最接近的三元素之和
- 个股与指数的回归分析(python)
- 求最大次大数
- 与中位数最接近的m个数
- 子数组的和与0最接近
- 全局探索式测试法
- 字典树模板
- PKU3074 DLX版 数独建01矩阵
- java Excel文件导入导出
- 云计算平台管理的三大利器Nagios、Ganglia和Splunk
- 求最接近的最大2的指数次幂roundup_pow_of_two分析与实现
- Json字符串与Json对象的相互转换
- 数据库的最简单实现
- 把图片画成圆形
- 【LeetCode】Word Break II 解题报告
- linux系统中监控用户的操作记录命令
- 关于建设symbol store的建议
- Google protol Buffer
- android获得layout对象