【位操作笔记】计算以10为底整数N的对数 普通方法
计算以10为底整数N的对数log10Nlog_{10}Nlog10N 普通方法
用于计算以10为底整数N的对数log10Nlog_{10}Nlog10N。例如 log10100=2log_{10}100=2log10100=2,log101000=3log_{10}1000=3log101000=3。
算法说明
以10为底整数N的整数对数log10Nlog_{10}Nlog10N,当 N 为 32 位非零整数时,整数对数log10Nlog_{10}Nlog10N的值一共只有 0 - 9 这10种情况,所以这个普通方法就是通过判断整数N的值的大小来获取对数log10Nlog_{10}Nlog10N的值,从 10910^9109 到 10110^1101 逐个进行比较。例如当N大于等于1000000000时,log10Nlog_{10}Nlog10N的值就为9;当N小于1000000000但大于等于100000000,log10Nlog_{10}Nlog10N的值就为8。
该算法就是使用这种浅显易懂的方式来计算log10Nlog_{10}Nlog10N的值。
实现代码
实现方式为:
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=2log10128=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}Nlog10N的值,21%的输入会在第二次比较时得到对数log10Nlog_{10}Nlog10N的值,2%在第三次比较时得到对数log10Nlog_{10}Nlog10N的值,以此类推,每次比较将剩余部分减少90%。因此,平均只需要不到2.6次操作就能得到对数值。但当输入值的分布不均匀时,尤其时数值普遍较小时,效率就会变得比较低。
算法来源
Bit Twiddling Hacks
算法计算过程
从 10910^9109 到 10110^1101 逐个进行比较。
计算示例
例如:
val = 1000000 = 10610^6106,所以log101000000=6log_{10}1000000=6log101000000=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的对数 普通方法相关推荐
- 如何在10亿个整数中找出前1000个最大的数?
作者:vincent-duan,专注 Java,沉迷开源,架构师社区合伙人! 面试题目:如何在10亿个整数中找出前1000个最大的数. 我们知道排序算法有很多: 冒泡算法:通过两层for循环,外层第一 ...
- python输入数字翻译成星期几-Python练习笔记——计算输入日期为改年的第几天、星期几...
# 输入年月日,如:1995年12月10日,计算是该年的第几天? # 同时计算出当天是星期几? print("请依据提示依次输入您想查询的年 月 日") # 第一段代码块(年月日输 ...
- 如何在10亿个整数中找出前1000个最大的数(TopN算法)
面试题目:如何在10亿个整数中找出前1000个最大的数. 我们知道排序算法有很多: 冒泡算法:通过两层for循环,外层第一次循环找到数组中最大的元素放置在倒数第一个位置,第二次循环找到第二大的元素放置 ...
- 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 题目 题目概述 运行示例 ...
- 计算以2为底的log
在学习 大数n!算法时, 想到log2(x)怎么算? math.h中没有log2接口, 只有log和log10. 上网查了下, 原来用对数换底公式可以搞定这事^_^ // @file power_ex ...
- C语言编程>第六周 ① 编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中。 在主函数中调用该函数计算出这n个整数之和。
例题:编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中. 在主函数中调用该函数计算出这n个整数之和. 代码如下: /*代码分析:录入函数需要两个参数:一个参数是需要用来存储数字的数组, ...
- 小何同学的leetcode刷题笔记 基础篇(01)整数反转
小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...
- 崩坏3卡池模拟器及毕业期望概率计算(含保底)
目录 崩坏3卡池模拟器及毕业期望概率计算(含保底) 简介 程序演示 得出的一些有趣结果 readme code 崩坏3卡池模拟器及毕业期望概率计算(含保底) 简介 最近学概率论要求写论文,没什么好写的 ...
- 给定一个10位的整数组成的串,形式如: d1d2d3d4d5d6d7d8d9d10 。 其中最后的一位(即 )是校验和,其使用以下运算规则以前面的9位上的整数作为参数获得结果
package Second;import java.util.InputMismatchException; import java.util.Scanner;public class Demo4 ...
- 【C零基础详解】Part1:7-1 计算摄氏温度 (10分)【变量的输入和输出】
7-1 计算摄氏温度 (10分) 给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C.计算公式:C=5×(F−32)/9.题目保证输入与输出均在整型范围内. 输入格式: 输入在一行中给出一个华 ...
最新文章
- linux devm_request_irq 引发BUG sleeping function called from invalid context问题
- tomcat架构分析(valve机制)【转】
- C++程序内存分配方式(堆与栈)
- 团队作业(五):冲刺总结
- JadClipse eclipse反编译插件
- json解析对应的value为null_解决golang json解析出现值为空的问题
- python @cached_property
- Mysql学习总结(53)——使用MySql开发的Java开发者规范
- 格式化js/html代码的好工具
- 基于评论、新闻的情感倾向分析作商品的价格预测
- TV Metro界面(仿泰捷视频TV版)源码解析
- python实现设计模式
- 基于Matlab对三自由度并联机构的正逆解
- 冯诺依曼体系结构浅析
- go+sqlite实现sgk完整部署,privacy,privacy-main
- 2015年自我激励及2014年的总结
- java基础 面试题
- spin_lock浅析
- 爱乐馆-无损古典之Various Artist 《飞利浦原封套系列55CD》(PHILIPS ORIGINAL JACKETS COLLECTION)[FLAC]...
- ChatGPT 公司 CEO —— Altman 给创业公司的建议