剑指Offer - 面试题15:二进制中1的个数

简介: 剑指Offer - 面试题15:二进制中1的个数

题目

请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,把9表示成二进制是1001,有俩位是1.因此,如果输入9,则函数输出2。

类似题目在leetcoed上191. 位1的个数也有。


分析

求余法

我们让num每次%2求余,得到是1就让count++;然后让num/2。直到num为0为止。

缺陷就是不能判断负数。

C

#include<stdio.h>
int NumberOf(int n)
{
  int count = 0;
  while (n > 0)
  {
    if (n % 2 == 1)
    {
      count++;
    }
    n = n / 2;
  }
  return count;
}
int main()
{
  int count = NumberOf(9);
  printf("二进制中1的个数:%d\n", count);
  return 0;
}


位运算

如果了解位运算,我们还可以优化代码。&与运算。只有俩边都为1才为1。

位运算快于除法,还是没能解决负数

C

#include<stdio.h>
int NumberOf(int n)
{
  int count = 0;
  while (n > 0)
  {
    count = n & 1;
    n = n >> 1;
  }
  return count;
}
int main()
{
  int count = NumberOf(9);
  printf("二进制中1的个数:%d\n", count);
  return 0;
}


二进制串法

因为给的是int类型,四个字节,每一个字节8位,共4*8=32位。这样就可以一位一位的判断。成功解决了负数的问题

C

#include<stdio.h>
int NumberOf(int n)
{
  int count = 0;
  int i = 0;
  for (i = 0; i < 32; i++)
  {
    if ((n & (1 << i)) != 0)
    {
      count++;
    }
  }
  return count;
}
int main()
{
  int count = NumberOf(9);
  printf("二进制中1的个数:%d\n", count);
  return 0;
}


优化位运算

我们其实可以让num与num-1做与运算。发现也可以,每次消去num的一个1。

C

#include<stdio.h>
int NumberOf(int n)
{
  int count = 0;
  while (0 != n)
  {
    count++;
    n &= (n - 1);
  }
  return count;
}
int main()
{
  int count = NumberOf(9);
  printf("二进制中1的个数:%d\n", count);
  return 0;
}


本章完!

目录
相关文章
|
7月前
|
存储
【面试题精讲】如何将二进制转为十六进制
【面试题精讲】如何将二进制转为十六进制
|
4月前
【每日一题Day134】面试题 05.02. 二进制数转字符串 | 二进制
【每日一题Day134】面试题 05.02. 二进制数转字符串 | 二进制
22 0
|
4月前
|
存储 Java
剑指Offer LeetCode 面试题15. 二进制中1的个数
剑指Offer LeetCode 面试题15. 二进制中1的个数
28 0
LeetCode 面试常用小技巧,通过二进制获得所有子集
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 这题的官方难度是Medium,点赞3489,反对79,通过率59.9%。从这个数据我们也可以看得出来,这是一道难度不是很大,但是质量很高的题。
LeetCode 面试常用小技巧,通过二进制获得所有子集
|
1月前
|
Java 程序员
java线程池讲解面试
java线程池讲解面试
62 1
|
2月前
|
存储 关系型数据库 MySQL
2024年Java秋招面试必看的 | MySQL调优面试题
随着系统用户量的不断增加,MySQL 索引的重要性不言而喻,对于后端工程师,只有在了解索引及其优化的规则,并应用于实际工作中后,才能不断的提升系统性能,开发出高性能、高并发和高可用的系统。 今天小编首先会跟大家分享一下MySQL 索引中的各种概念,然后介绍优化索引的若干条规则,最后利用这些规则,针对面试中常考的知识点,做详细的实例分析。
253 0
2024年Java秋招面试必看的 | MySQL调优面试题
|
2月前
|
存储 算法 Java
铁子,你还记得这些吗----Java基础【拓展面试常问题型】
铁子,你还记得这些吗----Java基础【拓展面试常问题型】
47 1
|
2月前
|
NoSQL Java 关系型数据库
凭借Java开发进阶面试秘籍(核心版)逆流而上
最近参加了面试或者身边有朋友在面试的兄弟有没有发现,现在的面试不仅会问八股文,还会考察框架、项目实战、算法数据结构等等,需要准备的越来越多。 其实面试的时候,并不是要求你所有的知识点都会,而是关键的问题答到点子上!这份《Java 开发进阶面试秘籍(核心版)》由 P8 面试官整体把控,目前已经更新了 30 万字! 资料中涵盖了一线大厂、中小厂面试真题,毕竟真题都是技术领域最经典的基础知识和经验沉淀的汇总,非常有必要学习掌握!双重 buff 叠加,offer 接到手软~ 点击此处取,这可能是你到目前为止领取的最具含金量的一份资料! 整套资料涵盖:Spring、Spring
|
2月前
|
存储 缓存 Java
面试官:什么是Java内存模型?
面试官:什么是Java内存模型?
113 0
面试官:什么是Java内存模型?