统计十进制数的二进制表示中1的个数 ← 清华 邓俊辉

【题目描述】
统计十进制数的二进制表示中1的个数。

【算法分析】
虽然曾在 
https://blog.csdn.net/hnjzsyjyj/article/details/110148954 发过一篇关于“统计十进制数的二进制表示中1的个数”的博客,但本文实现了一种新的思路。此思路来源于清华大学邓俊辉版《数据结构》http://dsa.cs.tsinghua.edu.cn/~deng/ds/src_link/countones/countones_2.cpp.htm 中的内容。现分析如下:
● POW(x) 函数
自定义的 POW(x) 函数,运行后得到 2^x。

int POW(int x){return 1<<x; //2^x
}

● MASK(x) 函数
自定义的 MASK(x) 函数,运行后得到以 2^x 个 0 及 2^x 个 1 相间的32位的二进制数。这是本文算法的一个重要核心点。

int MASK(int x){int t=POW(x);return ((unsigned long) -1)/(POW(t)+1);
}

其中,MASK(0)、MASK(1)、MASK(2)、MASK(3)、MASK(4)的值如下所示。

MASK(0) = 01010101010101010101010101010101(b) = 55555555(h)
MASK(1) = 00110011001100110011001100110011(b) = 33333333(h)
MASK(2) = 00001111000011110000111100001111(b) = 0f0f0f0f(h)
MASK(3) = 00000000111111110000000011111111(b) = 00ff00ff(h)
MASK(4) = 00000000000000001111111111111111(b) = 0000ffff(h)

● ROUND(x,c) 函数
自定义的 ROUND(x,c) 函数,运行时以 2^c 位为单位进行分组,相邻的组两两捉对累加给定的十进制数对应的二进制数中 1 的个数。这个函数是导致本文算法时间复杂度低的重要原因。

int ROUND(int x,int c){int u=x&MASK(c);int v=(x>>POW(c))&MASK(c);return u+v;
}

● 系统自带的求以 2 为底的 x 的对数 log2(x)

#include <bits/stdc++.h>
using namespace std;int main() {int x;cin>>x;cout<<log2(x);return 0;
}/*
in:8
out:3
*/


【算法代码】

#include <bits/stdc++.h>
using namespace std;int POW(int x){return 1<<x; //2^x
}int MASK(int x){ //得到以2^x个0及2^x个1相间的32位的二进制数int t=POW(x);return ((unsigned long) -1)/(POW(t)+1);
}int ROUND(int x,int c){int u=x&MASK(c);int v=(x>>POW(c))&MASK(c);return u+v;
}int countOnes(unsigned int n){n=ROUND(n,0);n=ROUND(n,1);n=ROUND(n,2);n=ROUND(n,3);n=ROUND(n,4);return n;
}int main() {int x;cin>>x;cout<<countOnes(x);return 0;
}/*
in:123
out:6
*/





【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/110148954
https://dsa.cs.tsinghua.edu.cn/~deng/ds/src_link/countones/countones_2.cpp.htm

https://vimsky.com/examples/usage/cpp-programming_library-function_cmath_log2.html





 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是API接口?API接口的类型,如何调用API接口?

当今互联网技术的发展越来越快&#xff0c;越来越多的网站和应用程序需要获取外部数据来提供更好的服务和用户体验&#xff0c;这就需要使用API接口。本文将会对API接口的概念、类型以及如何调用API接口进行简要介绍。 一、什么是API接口&#xff1f; API&#xff08;Applica…

不可忽视的PG表膨胀优化

我是一个目录 案例1. 什么是表膨胀&#xff1f;2. 表膨胀危害是什么&#xff1f;3. 表膨胀是怎么产生的&#xff1f;4. 如何优化膨胀表&#xff1f; 案例 先来看一例公有云服务登录web页面端卡住案例&#xff1a; 故障现象&#xff1a;WEB端登录非常缓慢&#xff0c;需要耗时5…

前馈神经网络(FFNN)和多层感知机(MLP)

多层感知器&#xff08;MLP, Multi-Layer Perceptron&#xff09;和前馈神经网络&#xff08;Feed-Forward Neural Network, FFNN&#xff09;是深度学习中两个经常被使用的术语&#xff0c;它们经常被互换使用。让我们详细地了解这两个术语&#xff1a; 多层感知器 (MLP): M…

刷题统计(蓝桥杯)

刷题统计 问题描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题? 输入格式 输入一行包含三个整数 a,b 和 n. 输出格式 输出一个整数代表…

leetcode做题笔记146. LRU 缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -…

【AD】【PCB封装规范计划】 -CON排针类

像这种CON&#xff0c;排针的。画PCB封装的时候&#xff0c;要把数字用丝印标出来&#xff01;&#xff01;&#xff01;

如何使用 Node.js和Express搭建服务器?

如何使用NodeJs搭建服务器 1. 准备工作1.1 安装Node.js 2. 安装express2.1 初始化package.json2.2 安装express2.3 Express 应用程序生成器 1. 准备工作 1.1 安装Node.js Node.js 是一个开源、跨平台的 JavaScript 运行时环境。 下载链接&#xff1a;Node.js官网下载 建议下…

Java面试常用函数

1. charAt() 方法用于返回字符串指定索引处的字符。索引范围为从 0 到 length() - 1。 map.getOrDefault(num, 0) :如果map存在num这个key&#xff0c;则返回num对应的value&#xff0c;否则返回0. Arrays.sort(nums); 数组排序 Arrays.asList("a","b",&q…

Xilinx ZYNQ 7000学习笔记五(Xilinx SDK 烧写镜像文件)

概述 前面几篇讲了ZYNQ7000的启动过程&#xff0c;包括BootRom和FSBL的代码逻辑&#xff0c;其中关于FSBL代码对启动模式为JTAG被动启动没有进行分析&#xff0c;本篇将通过将JTAG的功能和通过Xilinx SDK烧写镜像文件到flash来顺道把FSBL中的JTAG代码部分给讲解下。 1.JTAG …

NuttX实时操作系统介绍(最详细)

比起安卓、iOS、鸿蒙等&#xff0c;NuttX知名度不算高&#xff0c;该系统于2007年由Gregory Nutt先生正式开源。发展至今&#xff0c;NuttX以功能丰富、性能稳定、商业化成熟度高赢得了市场的认可。 NuttX是一个成熟的实时操作系统&#xff0c;于07年由Gregory Nutt先生正式开源…

Python手写K均值算法

Python手写K均值算法 1. 算法思维导图 #mermaid-svg-AZJG7sRwopfGiqyx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AZJG7sRwopfGiqyx .error-icon{fill:#552222;}#mermaid-svg-AZJG7sRwopfGiqyx .error-text{fi…

学习笔记-接口测试(postman、jmeter)

目录 一、什么是接口测试 二、前端和后端 三、get请求和post请求的区别 四、cookie和session 五、接口测试的依据 六、HTTP状态码 七、通用接口用例 八、postman接口测试 九、Jmeter接口测试 一、什么是接口测试 通常做的接口测试指的是系统对外的接口&#xff0c;比…

Linux 驱动扫描所有线程调用栈

测试环境 root:curtis# uname -a Linux curtis-Aspire-E5-471G 5.15.0-52-generic #58~20.04.1-Ubuntu SMP Thu Oct 13 13:09:46 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux root:curtis# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: …

leetcode做题笔记145. 二叉树的后序遍历

给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 思路一&#xff1a;递归 c语言解法 void postorder(struct TreeNode *root, int *res, int *resSize) {if (root NULL) {return;}postorder(root->left, res, resSize);postorder(root->right, …

机器学习:PCA(Principal Component Analysis主成分)降维

参考&#xff1a;PCA降维原理 操作步骤与优缺点_TranSad的博客-CSDN博客 PCA降维算法_偶尔努力翻身的咸鱼的博客-CSDN博客 需要提前了解的数学知识&#xff1a; 一、PCA的主要思想 PCA&#xff0c;即主成分分析方法&#xff0c;是一种使用最广泛的数据降维算法。PCA的主要思想…

qt 6知识集

1.Use multi-arg instead [clazy-qstring-arg] 存在过个arg&#xff0c;连写形式如下&#xff1a; QString("%1 %2").arg(a).arg(b);QString("%1 %2").arg(a, b); // one less temporary heap allocation详见参考文献[1]。 参考文献 [1] qstring-arg

【element-ui】el-date-picker 之picker-options时间选择区间禁用效果的实现

element-ui 时间选择器的时间区间禁用dom层引入:picker-option <el-date-pickerv-model"searchFormObj.workTime"clearablevalue-formate"yyyy-MM-dd":picker-options"pickerOptions"placeholder"请选择时间" ></el-date-pi…

基于深度强化学习的四旋翼无人机航线跟随

源自&#xff1a;指挥与控制学报 作者&#xff1a;杨志鹏 李波 甘志刚 梁诗阳 “人工智能技术与咨询” 发布 摘 要 针对无人机在空中执行航线跟随任务时无法对未知环境作出合理应对措施等问题, 提出了一种基于深度强化学习的四 旋翼无人机航线跟随方法. 通过无人机受力…

SpringMVC之JSON数据返回与异常处理机制---全方面讲解

一&#xff0c;JSON数据返回的理解 在Spring MVC中&#xff0c;当需要将数据以JSON格式返回给客户端时&#xff0c;可以使用ResponseBody注解或RestController注解将Controller方法的返回值直接转化为JSON格式并返回。这使得开发者可以方便地将Java对象转换为JSON&#xff0c;并…

【C++】STL之vector操作

文章目录 简介vector中的成员类型模板参数头文件的包含构造函数vector的访问方式&#xff1a;下标[ ]迭代器范围for 交换swap 简介 vector是stl中的一种数组容器&#xff0c;vector在英文中有矢量的意思&#xff0c;但实际上在数据结构中就是一种类似于数组的结构&#xff1b;…