编程之美求二进制数中1的个数

简介: 编程之美求二进制数中1的个数

题目:

对于一个字节(8bit的变量,求其二进制中“1”的个数,要求算法的执行效率尽可能地高。

 

举例:

十进制整数162的二进制表示为10 100 010,则162的二进制数中1的个数为3.

 

解法一:

要统计二进制数中1的个数,最容易想到的思路是从最右边开始逐个的看该位是否为1,如图1-1所示:

d1a7cb1a7c8a4fb7ff155e7bafd3a8eb.png


1- 1 162的二进制表示


思路很简单,接下来就是分析该思路中涉及到的主要的技术点。


1)如何判断该二进制位是否为1

最简单的方式就是将该数与0x01做与操作即162& 0x01 = 0x0,如图1-2所示。

2dc9e0802831d4c27150b04c81cadbf2.png


1- 2 162&0x01


注:0x01为十六进制表示。


2)如何从右开始逐个判断?

按照之前的思路,如图1-3我们希望箭头不停的往左移,通过移动箭头得到每一个二进制位。


705dc509ea20a5f5da72d1aa7815a789.png



1- 3 箭头左移得到每一个二进制位


我们是否可以换个思路呢?箭头不动,而是让整数向右移呢?这种方式我们同样可以得到每一个二进制位。


20143372a9a36a60e902bb5ab78c49ff.png


1- 4 箭头不动,二进制数向右移


很明显,我们希望整数右移,而箭头不变,因为这种方式编程非常的容易实现。整数右移一位,即162>> 1

 

有了上述两个技术点的分析,接下来就可以利用C语言完成。

// 求二进制数中1的个数

int count(int v){

           int num = 0;                                        //保存二进制数中1的个数

           while(v){

                       num+=  v  & 0x01;                  //将二进制数与0x01做与操作

                       v>> 1;                                     // 二进制数右移一位

           }

         

           return num;

}

 

 

您是否还有更好的解法呢?欢迎留言。

目录
相关文章
|
Rust 安全 程序员
Rust与C++:内存管理与安全性的比较
本文将对Rust和C++两种编程语言在内存管理和安全性方面进行深入比较。我们将探讨Rust如何通过其独特的所有权系统和生命周期管理来消除内存泄漏和悬挂指针等常见问题,并对比C++在这方面的挑战。此外,我们还将讨论Rust的类型系统和编译器如何在编译时捕获许多常见的运行时错误,从而提高代码的安全性。
|
传感器 监控 网络协议
modbus协议的定义-钡铼技术
Modbus协议是一种广泛应用于工业自动化和控制系统中的开放通信协议,由Modicon公司于1979年发布。该协议定义了消息结构,支持RS232、RS485和TCP/IP等多种电气接口和传输介质,具备开放性、简单性和适应性强等特点。Modbus采用主从通信模式,支持ASCII、RTU和TCP三种传输模式,确保数据传输的可靠性和准确性。其主要作用包括设备通信、监控与控制以及提供标准化接口,简化系统集成并适用于多种应用场景。
|
自然语言处理 Java
CoreNLP server的开启与使用方法
Ubuntu20.04.2系统本身不含有JDK,而CoreNLP需要依赖JDK进行运行,所以需要先安装好JDK,可以输入java,然后系统会自动提示没有安装JDK,并会推荐安装的版本
351 0
|
存储 人工智能 文字识别
AI开发初体验:昇腾加持,OrangePi AIpro 开发板
本文分享了作者使用OrangePi AIpro开发板的初体验,详细介绍了开箱、硬件连接、AI程序开发环境搭建、以及通过Jupyter Lab运行AI程序的过程,并展示了文字识别、图像分类和卡通化等AI应用实例,表达了AI时代已经到来的观点。
1763 1
|
Linux
Linux命令(109)之md5sum
Linux命令(109)之md5sum
348 1
|
前端开发
页面导入样式时,使用 link 和 @import 区别
在页面导入样式时,`<link>` 标签和 `@import` 语句有以下几点区别
|
前端开发 JavaScript 调度
🎉干货满满,React设计原理(三):藏在源码里的排位赛,Lane模型🎉
🎉干货满满,React设计原理(三):藏在源码里的排位赛,Lane模型🎉
|
安全 C++
C++标准库中的锁lock_guard、unique_lock、shared_lock、scoped_lock、recursive_mutex
C++标准库中的锁lock_guard、unique_lock、shared_lock、scoped_lock、recursive_mutex
806 0
|
机器学习/深度学习 供应链 算法
【数据分析模型】描述性 vs 预测性 vs 规范性 vs 诊断分析
【数据分析模型】描述性 vs 预测性 vs 规范性 vs 诊断分析
|
SQL 人工智能 前端开发
无代码的未来
随着无代码技术越来越成熟,很多web应用已经可以基于无代码平台进行开发。本文分析了4个最流行的无代码平台,并梳理了无代码行业今后可能的发展方向。
606 0
无代码的未来