最近在看recast&detour源码的时候有遇到许多数学上的算法问题,特此记录,以便以后查看。

举例:

Ilog2(8) = 3

Ilog2(15) = 3

Ilog2(16) = 4

思路:

从二进制角度看 即 右移几位 以后为1(最高位)

比如

8 = 1000b, 右移3位

15=1111b,右移3位

16=10000b,右移4位

源码:

inline unsigned int dtIlog2(unsigned int v)
{unsigned int r;unsigned int shift;r = (v > 0xffff) << 4; v >>= r;shift = (v > 0xff) << 3; v >>= shift; r |= shift;shift = (v > 0xf) << 2; v >>= shift; r |= shift;shift = (v > 0x3) << 1; v >>= shift; r |= shift;r |= (v >> 1);return r;
}

解析:

应用二分法的思想,将数进行移位。记 r 为需要右移的位数。

1)将此数与 0xffff 比较

如果比 0xffff 大,说明至少需要右移16位;r = 16(即1<<4 = 10000b);并将此数右移16位进行更新。

如果比 0xffff 小,什么都不做;r = 0。

2)将更新后的数与 0xff 比较

如果比 0xff 大,说明至少需要右移8位;r += 8(即1<<3 = 1000b);并将此数右移8位进行更新。

如果比 0xff 小,什么都不做;r += 0。

3)将更新后的数与 0xf(1111b)比较

如果比 0xf 大,说明至少需要右移4位;r += 4(即1<<2 = 100b);并将此数右移4位进行更新。

如果比 0xf 小,什么都不做;r += 0。

4)将更新后的数与 0x3(11b)比较

如果比 0x3 大,说明至少需要右移2位;r += 2(即1<<1 = 10b);并将此数右移2位进行更新。

如果比 0x3 小,什么都不做;r += 0。

5)将更新后的数(只剩下两个bit位 XXb )直接右移一位

如果结果为1,r+=1。

如果结果为0,r+=0。

r即为最终结果。

ps:此处 |= 即为 +=, 使用位运算更高效。 即 10000b | 1000b = 10000b + 1000b。

参考:

https://github.com/recastnavigation/recastnavigation

求一个数取log2的较小的整数 Ilog2相关推荐

  1. 求三个数中的最大数 (分别考虑整数、双精度数、长整数)【函数的重载】

    /*  * 程序的版权和版本声明部分:  * Copyright (c) 2012, 烟台大学计算机学院  * All rights reserved.  * 文件名称:求三个数中的最大数 (分别考虑 ...

  2. python求数字平均值_python 求10个数的平均数实例

    python 求10个数的平均数实例 更新时间:2019年12月16日 18:00:02 作者:qq_20076527 今天小编就为大家分享一篇python 求10个数的平均数实例,具有很好的参考价值 ...

  3. 7-10 求数字个数 (20 分)

    7-10 求数字个数 (20 分) 给出四个整数:A,B,K,C,其中A,B,C 都是大于 0 的个位数,问在所有仅由 A 或 B 组成的 K 位数中(K 位数的每一位都是 A 或 B),数字 C 的 ...

  4. 程序员数学基础【四、取模应用-判断奇偶数、判断素数、求两个数的最大公约数、水仙花数】(Python版本)

    测试使用语言:[Python] 由于此类语言入门非常容易,哪怕初中生亦可以,并且本科/研究生写论文.做实验多数所用语言都是[Python]故而选择此语言. 代码运行平台:[win10 x64] 代码环 ...

  5. C++实现1.交换两个整形变量的内容.2.不创建临时变量的条件下,交换两个数的内容.3.求是个整数中的最大值.4.将三个数按从大到小输出.5.求两个数的最大公约数.

    / //给定两个整型变量的值,并交换他们的值 int main(){ int a = 10; int b = 20; int temp = a; //创建一个临时变量,来做交换值的中间媒介 a = b ...

  6. 13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)

    package basic_class_01; /*** *小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.求一个数组的小和.例子:[1,3,4,2,5]1左边比1小的数 ...

  7. 求两个数中的较大(小)值

    输入两个数,(以整数为例)  输出这两个数中的较大(小)值 我调用一个函数 用到了三目运算符 求两个数的较大值时 有 max函数和 MAX 函数 先看max函数 int max(int a, int ...

  8. c语言怎么取一个数的平均值,c语言如何求n个数的平均值?

    c语言求n个数的平均值: 推荐:<c语言教程> #include int main(void) { int a[100] = { NULL };//初始化数组元素 int i = 0, n ...

  9. python编写函数、计算三个数的最大公约数_python 函数求两个数的最大公约数和最小公倍数...

    1. 求最小公倍数的算法: 最小公倍数 = 两个整数的乘积 / 最大公约数 所以我们首先要求出两个整数的最大公约数, 求两个数的最大公约数思路如下: 2. 求最大公约数算法: 1. 整数A对整数B进行 ...

最新文章

  1. usb-key登录windows+远程桌面
  2. access导出MySQL表格_将ACCESS 的数据库中的表的文件 导出了EXCEL格式
  3. oracle 提取首字母,oracle 取字段文字拼音首字母
  4. docker安装php怎么修改配置,怎么给docker配置内存大小?
  5. java泛型不是计算运行时的数据类型
  6. 最大公约数简便算法_求最大公约数的4种算法
  7. BCHN近期收到一笔1000 BCH的匿名捐款
  8. 可以记录阅读进度的 pdf 电脑阅读器
  9. 在vb中使用Iphlpapi.dll获取网络信息(下)
  10. mysql /!/_Mysql(一)
  11. 性能测试--jmeter中响应断言【9】
  12. 33个网站足以使你成为一个天才
  13. Android Jetpack组件 DataStore的使用和简单封装
  14. 空间里相片批量导入u盘_怎样将U盘内相片弄到QQ空间的相册内
  15. 计算机未设置无线网络,没有电脑怎么设置无线路由器
  16. 第二届(2017)中国IT武林大会暨2017年度中国IT年度人物颁奖盛典
  17. 项目管理网络图概念总结
  18. 拳皇重生服务器维护,《拳皇97 OL》3月8日更新维护公告
  19. P1296 分形宇宙
  20. 小米200万的新LOGO 一行代码就能修改?

热门文章

  1. 电脑一键重装一直在系统优化升级怎么办
  2. System.Data.OleDb.OleDbException: 至少一个参数没有被指定值。
  3. 不同封装的0Ω电阻,到底可以过多大电流?
  4. ExpandableListView实现可展开的ListView
  5. NOIP2017 滚粗记
  6. 麦可网嵌入式linux,麦可网张凌华体系结构及裸板篇ARM嵌入式开发视频教程
  7. 怎么设置计算机的开机音乐,如何设置电脑开机声音 教你怎么修改电脑开机登录的声音教程...
  8. java 定时关机_「window定时关机命令」电脑定时关机命令,这个方法适用于win7及以下系统 - seo实验室...
  9. android背景气泡,android之View跟LinearLayout的重写(实现背景气泡和波纹效果)
  10. matlab在天线方向图中的应用与研究,MATLAB在天线方向图中的应用与研究