查找整数在内存中的1

简介: 查找整数在内存中的1


/***********************************************************************

目的:统计一个整数的二进制补码中的有几个1

分析:

▶ 对于一个十进制整数要得到它的每一位十进制数需要不断的 %10 和 /10

▶ 对于一个十进制整数要得到它的每一位二进制数(补码)需要不断的 %2 和 /2

平台:Visual studio 2017 && windows

*************************************************************************/

📝 实现代码Numberof1:

#include<stdio.h>
int Numberof1(int n)
{
  int count = 0;
  while(n)
  {
    if(n % 2 == 1)
    {
      count++;  
    }
    n /= 2;
  }
  return count;
}
int main()
{
  int n = 15;
  int ret = Numberof1(n);
  printf("%d\n", ret);
  return 0;
}

❓❔ Numberof1能否统计负整数二进制中的1

📐 验证如下:


/***********************************************************************

目的:解决Numberof1函数不能统计负整数二进制中的1的问题

分析:

▶ 方法1,在传参的时候,形参的类型使用unsigned int来接收即可

▶ 方法2,使用按位与操作符 ‘&’

平台:Visual studio 2017 && windows

*************************************************************************/

📝 实现代码Numberof2:

#include<stdio.h>
int Numberof2(unsigned int n)
{
  int count = 0;
  while(n)
  {
    if(n % 2 == 1)
    {
      count++;  
    }
    n /= 2;
  }
  return count;
}
int main()
{
  int n = -1;
  int ret = Numberof2(n);
  printf("%d\n", ret);
  return 0;
}

📝 实现代码Numberof3:

#include<stdio.h>
int Numberof3(int n)
{
  int count = 0;//统计
  //while循环的方法:
  /*
  int twice = 32;//循环次数
  while(twice)
  {
    if(n & 1 == 1)
    {
      count++;
    }
    n >>= 1;
    twice--;
  }
  */
  //for循环的方法:
  int i = 0;
  for(i = 0; i < 32; i++)
  {
    if(((n >> i) & 1) == 1)
    {
      count++;
    } 
  }
  return count;
}
int main()
{
  int n = -1;
  int ret = Numberof3(n);
  printf("%d\n", ret);
  return 0;
}

❓❔ 看到这里,还可以优化或者有更好的写法吗,要的就是那种高大上的感觉

注:纯属为了装B😎


/***********************************************************************

目的:优化Numberof3代码

分析:n = n & (n - 1)

每次&都会去掉一个1(其实不难理解:只要有1,那么1 & 1-1则为0,直到全为0)

平台:Visual studio 2017 && windows

*************************************************************************/

📝 实现代码Numberof4:

#include<stdio.h>
int Numberof4(int n)
{
  int count = 0;
  while(n)
  {
    n = n & (n - 1);
    count++;
  }
  return count;
}
int main()
{
  int n = -1;
  int ret = Numberof4(n);
  printf("%d\n", ret);
  return 0;
}


🧿 拓展

/***********************************************************************

目的:写一个代码判断一个数字是不是2的n次方(n为正数)

分析:2的n次方数字,其补码只有一个1

▶ 我们当然可以去套用上面的Numberof4,但是这样就把代码复杂化了

▶ 只要n & (n - 1) == 0,n就是2的n次方

n = 8 状态
1000 n
0111 n-1
0000 n

平台:Visual studio 2017 && windows

*************************************************************************/

📝 实现代码Numberof5:

#include<stdio.h>
int Numberof5(int n)
{
  if((n & (n - 1)) == 0)
  {
    return 1; 
  }
  return 0;
}
int main()
{
  int n = 8;
  //Numberof5这个函数如果返回1,表示这个数是2的n次方;否则不是
  int ret = Numberof5(n);
  if(1 == ret)
  {
    printf("Yes\n");
  }
  else
  {
    printf("No\n"); 
  }
  return 0;
}



相关文章
|
6月前
|
存储
数据在内存中的存储之整数存储
数据在内存中的存储之整数存储
49 0
|
5月前
|
存储 C语言
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言进阶篇】整数在内存的存储——原码、反码、补码
|
5月前
|
存储 C语言
C语言---求一个整数存储在内存中的二进制中1的个数--3种方法
C语言---求一个整数存储在内存中的二进制中1的个数--3种方法
|
6月前
|
存储
整数和浮点数在内存中存储
整数的2进制表⽰⽅法有三种,即原码、反码和补码。
80 0
|
6月前
|
存储 算法
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
46 0
|
6月前
|
存储 编译器 C语言
C语言基础知识:数据在内存中的存储解析(整数,浮点数)
C语言基础知识:数据在内存中的存储解析(整数,浮点数)
|
6月前
|
存储 负载均衡 算法
负载均衡案例:如何只用2GB内存统计20亿个整数中出现次数最多的整数
负载均衡案例:如何只用2GB内存统计20亿个整数中出现次数最多的整数
103 2
|
6月前
|
存储 人工智能 小程序
C语言第二十八弹---整数在内存中的存储
C语言第二十八弹---整数在内存中的存储
|
6月前
|
人工智能 算法 BI
【经典问题】给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
【1月更文挑战第26天】【经典问题】给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
|
6月前
|
存储 小程序 编译器
整数和浮点数在内存中的存储​(大小端详解)
整数和浮点数在内存中的存储​(大小端详解)