剑指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;
}


本章完!

目录
相关文章
|
3月前
|
安全 编译器 C++
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
|
6月前
【一刷《剑指Offer》】面试题 23:从上往下打印二叉树
【一刷《剑指Offer》】面试题 23:从上往下打印二叉树
|
6月前
【一刷《剑指Offer》】面试题 22:栈的压入、弹出系列
【一刷《剑指Offer》】面试题 22:栈的压入、弹出系列
|
6月前
|
算法
【一刷《剑指Offer》】面试题 21:包含 main 函数的栈
【一刷《剑指Offer》】面试题 21:包含 main 函数的栈
|
6月前
【一刷《剑指Offer》】面试题 20:顺时针打印矩阵
【一刷《剑指Offer》】面试题 20:顺时针打印矩阵
|
6月前
【一刷《剑指Offer》】面试题 19:二叉树的镜像
【一刷《剑指Offer》】面试题 19:二叉树的镜像
|
6月前
【一刷《剑指Offer》】面试题 18:树的子结构
【一刷《剑指Offer》】面试题 18:树的子结构
|
6月前
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
|
6月前
【一刷《剑指Offer》】面试题 16:反转链表
【一刷《剑指Offer》】面试题 16:反转链表
|
6月前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点