统计二进制中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;
}


相关文章
|
算法 安全 Java
CobaltStrike windows7 无法上线
CobaltStrike windows7 无法上线
427 0
|
7月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前开发的16QAM调制与软解调系统,增加了硬件测试功能。该系统包含FPGA实现的16QAM调制、软解调、高斯信道、误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置模块。通过硬件测试,验证了不同SNR条件下的系统性能。16QAM软解调通过比较接收信号采样值与16个调制点的距离,选择最近的调制点来恢复原始数据。核心Verilog代码实现了整个系统的功能,包括SNR设置、信号处理及误码率统计。硬件测试结果表明系统在不同SNR下表现良好,详细操作步骤可参考配套视频。
162 13
|
7月前
|
监控 搜索推荐 Linux
top 与 htop 实时监控
`top` 和 `htop` 是 Linux 系统中常用的实时监控工具。`top` 命令默认每 3 秒刷新一次,显示系统整体概览和进程列表,支持基本的进程管理操作。`htop` 则提供更友好的界面,带有彩色条形图、鼠标支持和更多交互功能,如进程搜索、优先级调整等。两者都适用于监控系统资源和管理进程,但 `htop` 功能更丰富,用户体验更好,适合复杂场景。
180 8
|
12月前
|
IDE Java 测试技术
《深入理解Maven:构建工具、常用命令与项目包技巧解析》
《深入理解Maven:构建工具、常用命令与项目包技巧解析》
198 0
|
JSON 前端开发 Java
Springboot mvc开发之Rest风格及RESTful简化开发案例
Springboot mvc开发之Rest风格及RESTful简化开发案例
193 2
|
12月前
|
前端开发 测试技术
如何从零到一建立前端规范
【10月更文挑战第6天】
222 2
|
弹性计算 缓存 安全
阿里云服务器ECS实例2核4G有哪些?性能如何?
阿里云2核4G配置的云服务器提供多样化的ECS实例规格,如突发性能t6、经济型e、计算型c7/c6/c8i/c8a等,不同规格性能各异,参考价格从68元/月至203元/月不等。其中,经济型e和通用算力型u1实例为主推产品。2核4G配置理论上支持约20人同时在线访问,实际并发数受应用架构、带宽、用户行为等多种因素影响。详情参见阿里云官方页面。
|
小程序
手写签名-微信小程序
手写签名-微信小程序
178 1
|
存储 NoSQL Java
微服务技术系列教程(46)-SpringBoot整合MongoDB(文章评论案例)
微服务技术系列教程(46)-SpringBoot整合MongoDB(文章评论案例)
339 0
|
Go 开发工具 git
vscode设置go环境
vscode设置go环境
402 0