计算以10为底整数N的对数log10Nlog_{10}Nlog10​N 普通方法

用于计算以10为底整数N的对数log10Nlog_{10}Nlog10​N。例如 log10100=2log_{10}100=2log10​100=2,log101000=3log_{10}1000=3log10​1000=3。

算法说明

以10为底整数N的整数对数log10Nlog_{10}Nlog10​N,当 N 为 32 位非零整数时,整数对数log10Nlog_{10}Nlog10​N的值一共只有 0 - 9 这10种情况,所以这个普通方法就是通过判断整数N的值的大小来获取对数log10Nlog_{10}Nlog10​N的值,从 10910^9109 到 10110^1101 逐个进行比较。例如当N大于等于1000000000时,log10Nlog_{10}Nlog10​N的值就为9;当N小于1000000000但大于等于100000000,log10Nlog_{10}Nlog10​N的值就为8。

该算法就是使用这种浅显易懂的方式来计算log10Nlog_{10}Nlog10​N的值。

实现代码

实现方式为:

unsigned int bit_log10(unsigned int val)
{int ret;ret = (val >= 1000000000) ? 9 : (val >= 100000000) ? 8 : (val >= 10000000) ? 7 : (val >= 1000000) ? 6 : (val >= 100000) ? 5 : (val >= 10000) ? 4 : (val >= 1000) ? 3 : (val >= 100) ? 2 : (val >= 10) ? 1 : 0;return ret;
}

注意,如果传入的参数val不是10的次幂,则返回值是val的值向下舍入到最近的10的次幂的对数值。例如 val的值为128,则返回值为log10128=2log_{10}128=2log10​128=2。

测试程序:

int main(int argc, char* argv[])
{printf("%d\n", bit_log10(10));printf("%d\n", bit_log10(100));printf("%d\n", bit_log10(1000));printf("%d\n", bit_log10(10000));printf("%d\n", bit_log10(128));return 0;
}

运行结果如下:

1
2
3
4
2

该算法的计算方式虽然看起来简单粗暴,但是当输入值 N 均匀分布在32位时,这种方法效果就会特别好,因为76%的输入会在第一次比较时得到对数log10Nlog_{10}Nlog10​N的值,21%的输入会在第二次比较时得到对数log10Nlog_{10}Nlog10​N的值,2%在第三次比较时得到对数log10Nlog_{10}Nlog10​N的值,以此类推,每次比较将剩余部分减少90%。因此,平均只需要不到2.6次操作就能得到对数值。但当输入值的分布不均匀时,尤其时数值普遍较小时,效率就会变得比较低。

算法来源

Bit Twiddling Hacks

算法计算过程

从 10910^9109 到 10110^1101 逐个进行比较。

计算示例

例如:

val = 1000000 = 10610^6106,所以log101000000=6log_{10}1000000=6log10​1000000=6。

模拟这个比较计算的过程:

val >= 1000000000 ? 9 :不符合val >= 100000000 ? 8 :不符合val >= 10000000 ? 7 :不符合val >= 1000000 ? 6 :符合ret = 6

结束比较,得到答案6。


[参考资料]

Bit Twiddling Hacks By Sean Eron Anderson


本文链接:https://blog.csdn.net/u012028275/article/details/127147665

【位操作笔记】计算以10为底整数N的对数 普通方法相关推荐

  1. 如何在10亿个整数中找出前1000个最大的数?

    作者:vincent-duan,专注 Java,沉迷开源,架构师社区合伙人! 面试题目:如何在10亿个整数中找出前1000个最大的数. 我们知道排序算法有很多: 冒泡算法:通过两层for循环,外层第一 ...

  2. python输入数字翻译成星期几-Python练习笔记——计算输入日期为改年的第几天、星期几...

    # 输入年月日,如:1995年12月10日,计算是该年的第几天? # 同时计算出当天是星期几? print("请依据提示依次输入您想查询的年 月 日") # 第一段代码块(年月日输 ...

  3. 如何在10亿个整数中找出前1000个最大的数(TopN算法)

    面试题目:如何在10亿个整数中找出前1000个最大的数. 我们知道排序算法有很多: 冒泡算法:通过两层for循环,外层第一次循环找到数组中最大的元素放置在倒数第一个位置,第二次循环找到第二大的元素放置 ...

  4. Java黑皮书课后题第3章:**3.9(商业:检验ISBN-10)ISBN-10由10个个位整数d1d2d3d4d5d6d7d8d9d10组成,最后一位d10是校验和,输入前9个数,显示10位ISBN

    **3.9(商业:检验ISBN-10)ISBN-10由10个个位整数d1d2d3d4d5d6d7d8d9d10组成,最后一位d10是校验和,输入前9个数,显示10位ISBN 题目 题目概述 运行示例 ...

  5. 计算以2为底的log

    在学习 大数n!算法时, 想到log2(x)怎么算? math.h中没有log2接口, 只有log和log10. 上网查了下, 原来用对数换底公式可以搞定这事^_^ // @file power_ex ...

  6. C语言编程>第六周 ① 编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中。 在主函数中调用该函数计算出这n个整数之和。

    例题:编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中. 在主函数中调用该函数计算出这n个整数之和. 代码如下: /*代码分析:录入函数需要两个参数:一个参数是需要用来存储数字的数组, ...

  7. 小何同学的leetcode刷题笔记 基础篇(01)整数反转

    小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...

  8. 崩坏3卡池模拟器及毕业期望概率计算(含保底)

    目录 崩坏3卡池模拟器及毕业期望概率计算(含保底) 简介 程序演示 得出的一些有趣结果 readme code 崩坏3卡池模拟器及毕业期望概率计算(含保底) 简介 最近学概率论要求写论文,没什么好写的 ...

  9. 给定一个10位的整数组成的串,形式如: d1d2d3d4d5d6d7d8d9d10 。 其中最后的一位(即 )是校验和,其使用以下运算规则以前面的9位上的整数作为参数获得结果

    package Second;import java.util.InputMismatchException; import java.util.Scanner;public class Demo4 ...

  10. 【C零基础详解】Part1:7-1 计算摄氏温度 (10分)【变量的输入和输出】

    7-1 计算摄氏温度 (10分) 给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C.计算公式:C=5×(F−32)/9.题目保证输入与输出均在整型范围内. 输入格式: 输入在一行中给出一个华 ...

最新文章

  1. linux devm_request_irq 引发BUG sleeping function called from invalid context问题
  2. tomcat架构分析(valve机制)【转】
  3. C++程序内存分配方式(堆与栈)
  4. 团队作业(五):冲刺总结
  5. JadClipse eclipse反编译插件
  6. json解析对应的value为null_解决golang json解析出现值为空的问题
  7. python @cached_property
  8. Mysql学习总结(53)——使用MySql开发的Java开发者规范
  9. 格式化js/html代码的好工具
  10. 基于评论、新闻的情感倾向分析作商品的价格预测
  11. TV Metro界面(仿泰捷视频TV版)源码解析
  12. python实现设计模式
  13. 基于Matlab对三自由度并联机构的正逆解
  14. 冯诺依曼体系结构浅析
  15. go+sqlite实现sgk完整部署,privacy,privacy-main
  16. 2015年自我激励及2014年的总结
  17. java基础 面试题
  18. spin_lock浅析
  19. 爱乐馆-无损古典之Various Artist 《飞利浦原封套系列55CD》(PHILIPS ORIGINAL JACKETS COLLECTION)[FLAC]...
  20. ChatGPT 公司 CEO —— Altman 给创业公司的建议

热门文章

  1. Cache tier使用文档
  2. C语言如何作用于unity,在Unity 3D中使用C进行车轮转向#
  3. win10分辨率设置_雷电模拟器如何设置分辨率
  4. 常见js针对浏览器之间的兼容问题
  5. 小波变换matlab代码,matlab小波变换代码
  6. Hutool excel 设置单元格格式为文本
  7. js提交form表单给php,JS提交form表单实例分析
  8. word批量修改图片的大小
  9. 语音计算机在线算使用方法,计算器在线计算
  10. 如何用计算机算乘法,计算机如何做乘法运算的?