统计二进制中1的个数,,,写一个函数,返回参数二进制中1的个数 写一个代码判断一个数字是不是2的n次方

简介: 统计二进制中1的个数,,,写一个函数,返回参数二进制中1的个数 写一个代码判断一个数字是不是2的n次方
#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
//int main()
//{
//    int a, b, c;
//    a = 5;
//    c = ++a;
//    b = ++c, c++, ++a, a++;
//    b += a++ + c;
//    printf("a=%d b=%d c=%d\n");//a=9,b=23,c=8
//    return 0;
//}
//&是按位与 &&是逻辑与 ||是逻辑或 !是逻辑取反
//统计二进制中1的个数,,,写一个函数,返回参数二进制中1的个数
//比如15   0000 1111    4个1
//int retu(int n)
15为00001111   15%2=1,需要计数count++,15/2=7,7为0000111(去掉最后的1)7%2=1,计数count++,7/2=3,3为00000011(去掉最后的1)...
计数%2=1时,需要循环,并用count++
//{
//    int count = 0;
//    while (n)
//    {
//        if (n % 2 == 1)//只考虑正数,没考虑负数  ---可以直接将int retu (int n) 改为int retu(unsigned int n),但是还是没从根本上解决问题
//        {
//            count++;
//        }
//        n /= 2;
//    }
//    return count;
//}
//int main()
//{
//    int n = 15;
//    int ret=retu(n);
//    printf("ret=%d\n", ret);
//    return 0;
//}
//进阶版(法2)
//如果已知一个数字的二进制是几,想知道某一个位置的数组是0还是1,只需要只要直接将这个位置和00000000000000000000000000000001按位与即可-----
//如1111111111111111111111111111111111111111
//  0000000000000000000000000000000000000001最后一位按位与
//  0000000000000000000000000000000000000001结果为1
//int retu(int n)
//{
//    int count = 0;
//    int i = 0;
//    for (i = 0; i < 32; i++)//目的:使每次判断某一位n%1==1之后,向右移动一个
//    {
//        if ((n >> i) &1 == 1)//if (n & 1 == 1)判断该二进制的某一位是否为1   &为按位与
//        {
//            count++;//是1就计数,一次1
//        }
//    }
//    return count;
//}
//int main()
//{
//    int n = -1;
//    int ret = retu(n);
//    printf("ret=%d\n", ret);
//    return 0;
//}
//再次进阶版(法3)
// int retu(int n)
//{
//    int count = 0;
//    int i = 0;
//    while (n)//原为while(n!=0),!=0可以省略   //循环,如果用if语句,无法循环
//    {
//    n=n & (n - 1) ;
//        //n&(n-1)!=0就说明最终结果不是00000000000000000000000000000000,某一个二进制某一位有1,可以继续去掉1,每次去掉1都用count++
//        count++;
//    }
//    return count;
//}
//int main()
//{
//    int n = -1;
//    int ret = retu(n);
//    printf("ret=%d\n", ret);
//    return 0;
//}
//n=n&(n-1)--------n与n-1按位与会让二进制序列最右面的1去掉!!!!!!!!!!!!!!!!!!
//实例:n=15
//1111 - n
//1110 - n-1(按位与操作)
//1110 - n(新的n)(比p72的n少了1个1)
//1101 - n-1(按位与操作)
//1100 - n(新的n)(比p74的n少了1个1)
//1011 - n-1(按位与操作)
//1000 - n(新的n)(比p76的n少了1个1)
//0111 - n-1(按位与操作)
//0000 - n(新的n)(比p78的n少了1个1)
//例题  写一个代码判断一个数字是不是2的n次方
//2的n次方的数字的二进制,只有一个1
//k&(k-1)==0;
#include<stdlib.h>
void retu(int n)
{
    if((n & (n - 1))== 0)//原为while(n!=0),!=0可以省略   //循环,如果用if语句,无法循环
        printf("%d\n是n的2次方");
    //n&(n-1)!=0就说明最终结果不是00000000000000000000000000000000,某一个二进制某一位有1,可以继续去掉1,每次去掉1都用count++
    else
        printf("%d\n不是n的2次方");
}
int main()
{
    int n = -1;
    scanf("%d", &n);
    retu(n);
    return 0;
}


相关文章
|
30天前
读取7个数(1—50)的整数值
【10月更文挑战第10天】读取7个数(1—50)的整数值。
29 4
|
6月前
|
算法
算法题 — 整数转二进制,查找其中1的数量
算法题 — 整数转二进制,查找其中1的数量
44 0
|
6月前
[题]写一个函数返回参数二进制中1的个数。
[题]写一个函数返回参数二进制中1的个数。
29 1
|
C++
C++读取一行内个数不定的整数的方式
C++读取一行内个数不定的整数的方式
150 0
|
存储 算法 JavaScript
设计并实现一个函数, 功能为给定一个存储为随机整数的数组,从中删除所有值为i的整数
设计并实现一个函数, 功能为给定一个存储为随机整数的数组,从中删除所有值为i的整数
计算二进制中1的个数
计算二进制中1的个数
62 0
定义一个长度为10的整型数组,循环输入10个整数。 然后将输入一个整数,查找此整数,找到后输出下标,没找到给出提示。
定义一个长度为10的整型数组,循环输入10个整数。 然后将输入一个整数,查找此整数,找到后输出下标,没找到给出提示。
215 0
|
算法 Python
一日一技:如何统计一个数字的二进制值里面有多少个1
一日一技:如何统计一个数字的二进制值里面有多少个1
237 0
|
开发者
二进制中1的个数(上)
二进制中1的个数(上)
二进制中1的个数(上)