栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++中的高效运算】求最接近当前整数的2的n次方

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++中的高效运算】求最接近当前整数的2的n次方

此处求大于等于前整数x的最小的2的n次方,此处的代码短小精悍,十分高效,后文也附上了原理的解析,个人理解欢迎探讨,批评指正。

一、代码
int getCeilPowerOfTwo(int num)
{
	--num;
	num |= num >> 1;
	num |= num >> 2;
	num |= num >> 4;
	num |= num >> 8;
	num |= num >> 16;
	return ++num;
}
二、示例及原理分析
  • x = 160;
    x = 1010 0000(二进制)
  • x |= x >> 1;
    x = (x | x >> 1);
    x = ( 1010 0000 | 0101 0000) = 1111 0000;
  • x |= x >> 2;
    x = (x | x >> 2) = ( 1111 0000 | 0011 1100);
    = 1111 1100
  • x |= x >> 4;
    x = (x | x >> 4);
    x = ( 1111 1100 | 0011 1111) = 1111 1111
  • x |= x >> 8;
    x = (x | x >> 8);
    x = ( 1111 1111 | 0000 0000)
    = 1111 1111
  • x |= x >> 16;
    x = (x | x >> 16);
    x = ( 1111 1111 | 0000 0000)
    = 1111 1111
三、总结

算下来发现 我们拿到一个数160,对应的二进制数为1010 0000,通过计算我们知道大于它的最小的2的n次方就是256,就是2的8次方也就是1 0000 0000,可以看出2的8次方,就是数值1010 0000本身1的最高位的位数再左移1,或者就是巧妙的运用 了右移(速度快),和按位或运算(保证高位的1不会丢失,保证低位都是1)同样得到了2的8次方:1111 1111+1 = 1 0000 0000;

【注意】对于刚好是2的n次方的数字;
eg. x = 256 =1 0000 0000; 本身就是结果,按照上面的方式运算结果为1 1111 1111,再+1就大了,考虑到这种情况,所以最开始就要-1,大家也不妨自己拿一个小例子自己试试看哦~

如果觉得我的内容对你有帮助,请点赞支持以下哦,感谢~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1012406.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号