先上核心代码(文末附针对多种整数类型的代码):

inline int log_2(int x) {
int rst = 0;
if (x & 0xffff'0000U) rst += 16, x >>= 16;
if (x & 0x0000'ff00U) rst += 8, x >>= 8;
if (x & 0x0000'00f0U) rst += 4, x >>= 4;
if (x & 0x0000'000cU) rst += 2, x >>= 2;
if (x & 0x0000'0002U) rst += 1 ;
return rst;
}

原理很简单:

首先,任意正整数都可以拆分为数个互不相等的 2 的幂的和,且这些 2 的幂都小于等于该数;

其次,int 占用 32 位,故对于 int 范围内的数,其对数都不超过 31

最后,容易注意到二进制与对数间的天然联系,介于这种联系是显然且不易描述的,在此不予点明[doge];

综上,对于 int 类型的数据,其对数必然可以通过 {16, 8, 4, 2, 1} 组合出来,通过其二进制位即可判断其对数是由那几个数组合的。


附录(以下代码效率差别可以忽略不计,但代码量有显著差距):

inline auto log_2(uint64_t x) { // also unsigned long long
uint64_t rst = 0;
if (x & 0xffff'ffff'0000'0000ULL) rst += 32, x >>= 32;
if (x & 0x0000'0000'ffff'0000ULL) rst += 16, x >>= 16;
if (x & 0x0000'0000'0000'ff00ULL) rst += 8, x >>= 8;
if (x & 0x0000'0000'0000'00f0ULL) rst += 4, x >>= 4;
if (x & 0x0000'0000'0000'000cULL) rst += 2, x >>= 2;
if (x & 0x0000'0000'0000'0002ULL) rst += 1 ;
return rst;
}
inline auto log_2(uint32_t x) { // also unsigned int
uint32_t rst = 0;
if (x & 0xffff'0000U) rst += 16, x >>= 16;
if (x & 0x0000'ff00U) rst += 8, x >>= 8;
if (x & 0x0000'00f0U) rst += 4, x >>= 4;
if (x & 0x0000'000cU) rst += 2, x >>= 2;
if (x & 0x0000'0002U) rst += 1 ;
return rst;
}
inline auto log_2(uint16_t x) { // also unsigned short
uint16_t rst = 0;
if (x & 0x0000'ff00U) rst += 8, x >>= 8;
if (x & 0x0000'00f0U) rst += 4, x >>= 4;
if (x & 0x0000'000cU) rst += 2, x >>= 2;
if (x & 0x0000'0002U) rst += 1 ;
return rst;
}
inline auto log_2(uint8_t x) { // also unsigned char
uint8_t rst = 0;
if (x & 0x00f0U) rst += 4, x >>= 4;
if (x & 0x000cU) rst += 2, x >>= 2;
if (x & 0x0002U) rst += 1 ;
return rst;
}

快速 log2 取整算法 (O(1) 时间与空间复杂度)的更多相关文章

  1. 【转】C语言快速幂取模算法小结

    (转自:http://www.jb51.net/article/54947.htm) 本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速 ...

  2. Raising Modulo Numbers_快速幂取模算法

    Description People are different. Some secretly read magazines full of interesting girls' pictures, ...

  3. 栈(stack)、递归(八皇后问题)、排序算法分类,时间和空间复杂度简介

    一.栈的介绍: 1)栈的英文为(stack)2)栈是一个先入后出(FILO-First In Last Out)的有序列表.3)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的 ...

  4. log2取整效率测试

    RMQ问题中有个ST算法,当然还有个标准算法.LCA问题可以转化为带限制的RMQ(RMQ+-1)问题来解决.我们姑且认为这些问题的时间复杂度是查询$O(1)$的.但是,注意到对于RMQ(/+-1)问题 ...

  5. 位运算之——按位与(&)操作——(快速取模算法)

    学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...

  6. 【Java基础】14、位运算之——按位与(&)操作——(快速取模算法)

    学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...

  7. Powmod快速幂取模

    快速幂取模算法详解 1.大数模幂运算的缺陷: 快速幂取模算法的引入是从大数的小数取模的朴素算法的局限性所提出的,在朴素的方法中我们计算一个数比如5^1003%31是非常消耗我们的计算资源的,在整个计算 ...

  8. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

  9. 《Java语言实现快速幂取模》

    快速幂取模算法的引入是从大数的小数取模的朴素算法的局限性所提出的,在朴素的方法中我们计算一个数比如5^1003%31是非常消耗我们的计算资源的,在整个计算过程中最麻烦的就是我们的5^1003这个过程 ...

  10. 你可能不知道的 JavaScript 中数字取整

    网上方法很多,标题党一下,勿拍 ^_^!实际开发过程中经常遇到数字取整问题,所以这篇文章收集了一些方法,以备查询. 常用的直接取整方法 直接取整就是舍去小数部分. 1.parseInt() parse ...

随机推荐

  1. Java Cache系列之Cache概述和Simple Cache

    前记:最近公司在做的项目完全基于Cache(Gemfire)构建了一个类数据库的系统,自己做的一个小项目里用过Guava的Cache,以前做过的项目中使用过EHCache,既然和Cache那么有缘,那 ...

  2. Python:pygame游戏编程之旅四(游戏界面文字处理)

    本节讲解游戏界面中字体的处理,以在界面中实时显示当前时间.小球位置为例进行实验,具体见代码. 一.代码 # -*- coding:utf-8 -*- import os import sys impo ...

  3. 【Java基础】-- instanceof 用法详解

    1. instanceof关键字 如果你之前一直没有怎么仔细了解过instanceof关键字,现在就来了解一下: instanceof其实是java的一个二元操作符,和=,<,>这些是类似 ...

  4. onlyoffice

    https://helpcenter.onlyoffice.com/installation/docs-enterprise-install-centos.aspx?_ga=2.51626159.76 ...

  5. 一个 tomcat 下部署多个项目(超细另类版)

    前言:网上大佬们的都是一个webapps下面部署多个项目,咱们今天来点不一样的,另一种思路则是,多个webapps,每个webapps下面运行一个项目,不知如何本地部署的可以去看看我上一篇随笔 具体步 ...

  6. Element Plus组件库el-table单元格内容超出时tooltip显示优化

    前情 公司有经常需要做一些后台管理页面,我们选择了Element Plus,它是基于 Vue 3,面向设计师和开发者的组件库,是Vue框架生态中比较火的UI组件库,组件库丰富易用,组件链接:一个 Vu ...

  7. uni-app生命周期小测

    标签: js uni-app 前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni-app. ...

  8. SQLServer创建用户后无法登录,报错18456的解决方式

    原因:SQLServer没有设置为混合模式. 解决方法: 服务器本地通过Windows验证,打开SQLServer 右键服务器,选择安全性,选择为混合验证模式,然后重启SQLServer服务即可.

  9. 数据万象推出智能检索MetaInsight,现已开启限时公测

    海量文件的分析统计一直是对象存储COS的热点需求,伴随AIGC飞速迭代发展,在众多不同模态素材的海洋中,用户也急需更高效地管理和利用多媒体内容,打破传统搜索的桎梏. 数据万象推出的智能检索 MetaI ...

  10. 配置YUM源出现Errno 14 Could not open/read repomd.xml 或者 "Couldn't open file /mnt/cdrom/repodata/repomd.xml" 错误的解决办法

    报错信息: [root@tcljr-jdh-uat007 yum.repos.d]# yum makecache Loaded plugins: fastestmirror Loading mirro ...