求一个数的二进制中有多少了 1 的三种算法 ——C语言篇

求一个数的二进制中有多少了 1 的三种算法 ——C语言篇

  • 如图:

    • 在这里插入图片描述

  • 判断一个数值的二进制中包含有多少个 1


算法一:通过取模 % 运算就取出每一比特位数值,再判断

思路:

  • 通过取模 num % 2 == 1 运算取出该数的每一个二进制位数,再判断是否等于 1;
  • 我们定义一个变量计数:
  • 再通过 num /= 2; 的方式位移其数值的一个比特位;
  • 最后打印数值

代码:

#include<stdio.h>
// 一. 通过数学上的取模(%)该数二进制的每一位,比较判断是否为 1;
int main()
{
	int num = 0;
	int count = 0;
	scanf("%d", &num);
	int save = num;
	while (num)
	{
		if (num % 2 == 1)
		{
			count++;
		}
		
		num /= 2;
		
	}

	printf("%d二进制中含有 %d\n", save, count++);

	return 0;
}

算法二:通过 移位 运算符,再 & 运算判断

思路:

  • 主要核心:通过 if( ( ( num >> i) & 1 ) == 1 )

  • 首先循环 >> 移位,再 与 &(与运算) 1,取出每一个比特位,再判断是否为 1 ;

  • 详解看图:

    • 在这里插入图片描述

  • 通过图我们可以发现,& 1 运算可以取出第一个比特位的数值:

  • 注意我们这里是 Int类型的数值,所以一共有 32 个比特位;

代码:

#include<stdio.h>
// 二.通过右移位运算符,取出数值中二进制中的每一位值,并判断
// 这里是 以 int 类型,32个比特位,所以右移32位进行了,
int main()
{
	int num = 0;
	scanf("%d", &num);
	int count = 0;
	int save = num;
	for (int i = 0; i < 32; i++)
	{
		if (( (num >> i) && 1)== 1)
		{
			count++;
		}
		
	}

	printf("%d该数值二进制中含有 %d个 1\n", save, count);

	return 0;
}

算法三:n & (n-1) 的次数直到为 0 的 逻辑与运算的次数

思路:

  • 通过 n & (n-1) 的次数,判断其数值的二进制中存在多少了 1;

    • 在这里插入图片描述

  • 从上述图中我们可以发现,**n & ( n-1 )**运算直到为零的时候结束,其中进行 & 与运算的次数刚好就是其中

  • 数值二进制中所含的数值 1 的个数

  • 如果你认为是巧合的话,你可以拿其他数值计算一下的


代码:

#include<stdio.h>
// 通过 n &(n-1) 的次数,判断该数二进制中含有 1 的个数
int main()
{
	int num = 0;
	int count = 0;
	scanf("%d", &num);
	int save = num;
	while (num)
	{
		num &= (num - 1);
		count++;
	}

	printf("%d该数二进制中含有 %d个1\n", save, count);
	return 0;
}

总结:

  • 其前两种的算法,都是取出每一个比特位的数值,再判断是否为 1 ,只是方式不一样而已,但是目的都是一样的取出每个比特位,判断。
  • 最后一种算法,就是一种数学上的某种规律的方法,巧妙地计算其个数,速度也是最快的

最后:

每博一文案

别惯坏了得寸进尺的人,把你的付出当成理所应当,别纵容不知感恩的心,把你的好意当成傻子嬉戏,对你好的人要加倍珍惜,把你冷落的人要趁早远离,别惊得过火,也别傻的可怜,做人做事,无愧于心就好。

​ —————— 一禅心灵庙语

限于自身水平,其中存在的错误 希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《妙趣横生的算法(C语言实现)》可作为算法入门人员的教程,也可以作为学习过C语言程序设计的人士继续深造的理想读物,也可作为具有一定经验的程序设计人员巩固和提高编程水平,查阅相关算法实现和数据结构知识的参考资料,同时也为那些准备参加与算法数据结构相关的面试的读者提供一些有益的帮助。最大的特色在于实例丰富,题材新颖有趣,实用性强,理论寓于实践之。理论与实践相结合,旨在帮助读者理解算法,并提高C语言编程能力,培养读者的编程兴趣,并巩固已有的C语言知识。全书分为2个部分共10章,内容涵盖了编程必备的基础知识(如数据结构、常用算法等),编程实例介绍,常见算法数据结构面试题等。可以使读者开阔眼界,提高编程的兴趣,提高读者的编程能力和应试能力。 目录: 第1部分 基础 第1章 数据结构基础 1.1 什么是数据结构 1.2 顺序表 1.2.1 顺序表的定义 1.2.2 向顺序表插入元素 1.2.3 从顺序表删除元素 1.2.4 实例与分析 1.3 链表 1.3.1 创建一个链表 1.3.2 向链表插入结点 1.3.3 从链表删除结点 1.3.4 销毁一个链表 1.3.5 实例与分析 1.4 栈 1.4.1 栈的定义 1.4.2 创建一个栈 1.4.3 入栈操作 1.4.4 出栈操作 1.4.5 栈的其他操作 1.4.实例与分析 1.5 队列 1.5.1 队列的定义 1.5.2 创建一个队列 1.5.3 入队列操作 1.5.4 出队列操作 1.5.5 销毁一个队列 1.5.6 循环队列的概念 1.5.7 循环队列的实现 1.5.8 实例与分析 1.6 树结构 1.6.1 树的概念 1.6.2 树结构的计算机存储形式 1.6.3 二叉树的定义 1.6.4.二叉树的遍历 1.6.5 创建二叉树 1.6.6 实例与分析 1.7 图结构 1.7.1 图的概念 1.7.2 图的存储形式 1.7.3 邻接表的定义 1.7.4.图的创建 1.7.5 图的遍历(1)——深度优先搜索 1.7.6 图的遍历(2)——广度优先搜索 1.7.7 实例与分析 第2章 常用的查找与排序方法 2.1 顺序查找 2.2 折半查找 2.3 排序的概述 2.4 直接插入排序 2.5 选择排序 2.6 冒泡排序 2.7 希尔排序 2.8 快速排序 第3章 常用的算法思想 3.1 什么是算法 3.2 算法的分类表示及测评 3.2.1 算法的分类 3.2.2 算法的表示 3.2.3 算法性能的测评 3.3 穷举法思想 3.3.1 基本概念 3.3.2 寻找给定区间的素 3.3.3 TOM的借书方案 3.4 递归与分治思想 3.4..1 基本概念 3.4.2 计算整的划分 3.4.3 递归的折半查找算法 3.5 贪心算法思想 3.5.1 基本概念 3.5.2 最优装船问题 3.6 回溯法 3.6.1 基本概念 3.6.2 四皇后问题解 3.7 值概率算法 3.7.1 基本概念 3.7.2 计算定积分 第2部分 编程实例解析 第4章 编程基本功 4.1 字符类型统计器 4.2 计算字符的ASCII码 4.3 嵌套if.else语句的妙用 4.4 基于switch语句的译码器 4.5 判断闰年 4.6 指针变量作参 4.7 矩阵的转置运算 4.8 矩阵的乘法运算 4.9 巧用位运算 4.10 文件的读写 4.11 计算文件的大小 4.12 记录程序的运行时间 4.13 十进制/二进制转化器 4.14 打印特殊图案 4.15 打印杨辉三角 4.16 复杂级的前n项和 4.17 寻找矩阵的“鞍点” 4.18 n阶勒让德多项式解 4.19 递归反向输出字符串 4.20 一年的第几天 第5章 学趣题(一) 5.1 舍罕王的失算 5.2 两个的最大公约和最小公倍 5.3 歌德巴赫猜想的近似证明 5.4 三色球问题 5.5 百钱买百鸡问题 5.6 判断回文字 5.7 填字游戏解 5.8 新郎和新娘 5.9 爱因斯坦的阶梯问题 5.10 寻找水仙花 5.11 猴子吃桃问题 5.12 兔子产仔问题 5.13 分解质因 5.14 常胜将军 5.15 兀的近似值 5.16 魔幻方阵 5.17 移字游戏 5.18 字的全排列 5.19 完全 5.20 亲密 5.21 字翻译器 5.22 递归实现制转换 5.23 谁在说谎 第6章 学趣题(二) 6.1 连续整固定和问题 6.2 表示成两个的平方和 6.3 具有特殊性质的 6.4 验证角谷猜想 6.5 验证四方定理 6.6 递归法寻找最小值 6.7 寻找同构 6.8 验证尼科彻斯定理 6.9 三重回文字 6.10 马克思手稿学题 6.11 渔夫捕鱼问题 6.12 寻
图书目录编辑 第一章:程序设计和C语言   1.1什么是计算机程序   1.2什么是计算机语言   1.3C语言的发展及其特点   1.4最简单的C语言程序   1.4.1最简单的C语言程序举例   1.4.2C语言程序的结构   1.5运行C程序的步骤与方法   1.6程序设计的任务   习题 第2章:算法——程序的灵魂 2.1什么是算法 2.2简单的算法举例 2.3算法的特性   2.4怎样表示一个算法   2.4.1;用自然语言表示算法 2.4.2用流程图表示算法 2.4.3三种基本结构和改进的流程图   2.4.4用N-S流程图表示算法   2.4.5用伪代码表示算法   2.4.6用计算机语言表示算法   2.5结构化程序设计方法   习题 第3章:简单的C程序设计——顺序程序设计 3.1顺序程序设计举例   3.2数据的表现形式及其运算   3.2.1常量和变量   3.2.2数据类型   3.2.3整型数据   3.2.4字符型数据   3.2.5浮点型数据   3.2.6怎样确定常量的类型   3.2.7运算符和表达式   3.3C语句   3.3.1C语句的作用和分类   3.3.2最基本的语句——赋值语句   3.4数据的输入输出   3.4.1输入输出举例   3.4.2有关数据输入输出的概念   3.4.3用printf函输出数据   3.4.4用scanf函输入数据   3.4.5字符数据的输入输出   习题 第4章:选择结构程序设计 4.1选择结构和条件判断   4.2用if语句实现选择结构   4.2.1用if语句处理选择结构举例   4.2.2if语句的一般形式   4.3关系运算符和关系表达式   4.3.1关系运算符及其优先次序   4.3.2关系表达式   4.4逻辑运算符和逻辑表达式   4.4.1逻辑运算符及其优先次序   4.4.2逻辑表达式   4.4.3逻辑型变量   4.5条件运算符和条件表达式   4.6选择结构的嵌套   4.7用switch语句实现多分支选择结构   4.8选择结构程序综合举例   习题 第5章;循环结构程序设计 5.1为什么需要循环控制 5.2用while语句实现循环   5.3用do…while语句实现循环   5.4用for 语句实现循环   5.5循环的嵌套   5.6几种循环的比较   5.7改变循环执行的状态   5.7.1用break语句提前终止循环   5.7.2用continue语句提前结束本次循环   5.7.3break语句和continue语句的区别   5.8循环程序举例   习题 第6章;利用组处理批量数据 6.1.怎样定义和引用一维组   6.1.1怎样定义一维组   6.1.2怎样引用一维组元素   6.1.3一维组的初始化   6.1.4一维组程序举例   6.2.怎样定义和引用二维组   6.2.1怎样定义二维组   6.2.2怎样引用二维组的元素   6.2.3二维组的初始化   6.2.4二维组程序举例   6.3.字符组 6.3.1怎样定义字符组   6.3.2字符组的初始化   6.3.3怎样引用字符的元素   6.3.4字符串和字符串结束标志   6.3.5字符组的输入输出   6.3.6使用字符串处理函   6.3.7字符组应用举例   习题 第7章:用函实现模块化程序设计 7.1为什么要用函   7.2怎样定义函   7.2.1为什么要定义函   7.2.2定义函的方法   7.3调用函174   7.3.1函调用的形式   7.3.2函调用时的数据传递   7.3.3函调用的过程   7.3.4函的返回值   7.4对被调用函的声明和函原型   7.5函的嵌套调用   7.6函的递归调用   7.7组作为函   7.7.1组元素作函实参   7.7.2组名作函   7.7.3多维组名作函   7.8局部变量和全局变量   7.8.1局部变量   7.8.2全局变量   7.9变量的存储方式和生存期   7.9.1动态存储方式与静态存储方式   7.9.2局部变量的存储类别   7.9.3全局变量的存储类别   7.9.4存储类别小结   7.10关于变量的声明和定义   7.11内部函和外部函   7.11.1内部函   7.11.2外部函   习题 第8章;善于利用指针 8.1指针是什么   8.2指针变量 8.2.1使用指针变量的例子   8.2.2怎样定义指针变量   8.2.3怎样引用指针变量   8.2.4指针变量作为函   8.3通过指针引用组   8.3.1组元素的指针   8.3.2在引用组元素时指针的运算   8.3.3通过指针引用组元素   8.3.4用组名作函   8.3.5通过指针引用多维组   8.4通过指针引用字符串   8.4.1字符串的引用方式   8.4.2字符指针作函   8.4.3使用字符指针变量和字符组的比较   8.5指向函的指针   8.5.1什么是函指针   8.5.2用函指针变量调用函   8.5.3怎样定义和使用指向函的指针变量   8.5.4用指向函的指针作函   8.6返回指针值的函   8.7指针组和多重指针   8.7.1什么是指针组   8.7.2指向指针数据的指针   8.7.3指针组作main函的形参   8.8动态内存分配与指向它的指针变量   8.8.1什么是内存的动态分配   8.8.2怎样建立内存的动态分配   8.8.3void指针类型   8.9有关指针的小结   习题 第9章;用户自己建立数据类型 9.1定义和使用结构体变量   9.1.1自己建立结构体类型   9.1.2定义结构体类型变量   9.1.3结构体变量的初始化和引用   9.2使用结构体组   9.2.1定义结构体组   9.2.2结构体组的应用举例   9.3结构体指针   9.3.1指向结构体变量的指针   9.3.2指向结构体组的指针   9.3.3用结构体变量和结构体变量的指针作函   9.4用指针处理链表   9.4.1什么是链表   9.4.2建立简单的静态链表   9.4.3建立动态链表   9.4.4输出链表   9.5共用体类型   9.5.1什么是共用体类型   9.5.2引用共用体变量的方式   9.5.3共用体类型数据的特点   9.6使用枚举类型   9.7用typedef声明新类型名   习题 第10章;对文件的输入输出 10.1C文件的有关基本知识   10.1.1什么是文件   10.1.2文件名   10.1.3文件的分类   10.1.4文件缓冲区   10.1.5文件类型指针   10.2打开与关闭文件   10.2.1用fopen函打开数据文件   10.2.2用fclose函关闭数据文件   10.3顺序读写数据文件   10.3.1怎样向文件读写字符   10.3.2怎样向文件读写一个字符串   10.3.3用格式化的方式读写文件   10.3.4用二进制方式向文件读写一组数据   10.4随机读写数据文件   10.4.1文件位置标记及其定位   10.4.2随机读写   10.5文件读写的出错检测   习题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值