ccf中学生计算机程序设计入门篇课后题p164页test(1)-2 输入一个数,统计这个数二进制中1的个数

include <iostream>
using namespace std;int main() {int x;int n = 0;// 输入数据cin >> x;// 统计x二进制中1的个数for (n = 0; x != 0; x &= x - 1) {n++;}// 输出结果cout << n << endl;return 0;
}

程序解释:

  1. 输入:程序从标准输入读取一个整数 x
  2. 统计二进制中1的个数
    • 使用 for 循环,初始条件为 n = 0
    • 循环条件为 x != 0
    • 每次循环,x 更新为 x &= x - 1,这一步会去掉 x 的二进制表示中最低位的 1
    • 每次循环,n 增加 1,表示找到一个 1
  3. 输出:循环结束后,输出 n,即 x 的二进制表示中 1 的个数。

当我们输入 3 时,程序的运行步骤和变量变化如下:

初始状态:

  • x = 3 (输入的十进制数)
  • n = 0 (用于统计二进制中 1 的个数)

二进制表示:

  • 3 的二进制表示为 11

运行步骤:

  1. 第一次循环:

    • x = 3 (二进制:11
    • x - 1 = 2 (二进制:10
    • x &= x - 13 & 2,结果为 2 (二进制:10
    • n++n0 变为 1
  2. 第二次循环:

    • x = 2 (二进制:10
    • x - 1 = 1 (二进制:01
    • x &= x - 12 & 1,结果为 0 (二进制:00
    • n++n1 变为 2
  3. 循环结束:

    • x = 0,循环条件 x != 0 不满足,退出循环

最终状态:

  • x = 0
  • n = 2

输出结果:
程序输出 2,表示 3 的二进制表示中有 21

总结:

  • 输入 3,其二进制为 11,包含 21
  • 程序通过 x &= x - 1 的操作,每次消除二进制表示中最右边的 1,直到 x 变为 0,最终统计出 1 的个数为 2

你: 这个for循环,一开始是输入3,满足下x!=0的条件不应该是n++,n变成1吗?还是?到底这个for循环的执行顺序是什么?

你提到的代码是用来统计一个整数的二进制表示中1的个数。为了帮助你更好地理解这个for循环的执行顺序,我们来详细分析一下代码的执行过程,特别是for循环的执行顺序。

代码分析

include <iostream>
using namespace std;int main() {int x;int n = 0;// 输入数据cin >> x;  // 假设输入的是3// 统计x二进制中1的个数for (n = 0; x != 0; x &= x - 1) {n++;}// 输出结果cout << n << endl;return 0;
}

执行步骤

  1. 初始化

    • x 被赋值为3(假设用户输入3)。
    • n 被初始化为0。
  2. for循环的执行顺序

    • for循环的语法是:for (初始化; 条件; 更新) { 循环体 }
    • 在每次循环开始时,首先检查条件(x != 0),如果条件为真,则执行循环体,然后执行更新部分(x &= x - 1),接着再次检查条件,以此类推。
  3. 第一次循环

    • 条件检查x != 0(3 != 0),条件为真,进入循环体。
    • 循环体n++n从0变为1。
    • 更新x &= x - 1,即 x = x & (x - 1)
      • x - 1 的结果是2(3 - 1 = 2)。
      • x & (x - 1)3 & 2,即 0b11 & 0b10 = 0b10,所以 x 被更新为2。
  4. 第二次循环

    • 条件检查x != 0(2 != 0),条件为真,进入循环体。
    • 循环体n++n从1变为2。
    • 更新x &= x - 1,即 x = x & (x - 1)
      • x - 1 的结果是1(2 - 1 = 1)。
      • x & (x - 1)2 & 1,即 0b10 & 0b01 = 0b00,所以 x 被更新为0。
  5. 第三次循环

    • 条件检查x != 0(0 != 0),条件为假,循环结束。

变量变化

循环次数x 的二进制x 的十进制n 的值
初始化0b1130
第一次0b1021
第二次0b0002

最终输出

程序最终输出 n 的值,即 2

总结

  • for循环的执行顺序是:初始化 → 条件检查 → 循环体 → 更新 → 条件检查 → 循环体 → 更新 → …
  • 在这个例子中,for循环会执行两次,每次循环都会减少x中1的个数,并增加n的值,直到x变为0。

希望这个解释能帮助你更好地理解for循环的执行顺序和代码的工作原理!


你: 很好,n是4095的时候,列一下for运行过程

我们来看一下当 x = 4095 时,for 循环的执行过程。x = 4095 的二进制表示是 111111111111,共有 12 个 1

for 循环的执行顺序:

for (n = 0; x != 0; x &= x - 1) {n++;
}
  1. 初始化n = 0
  2. 条件判断:检查 x != 0。如果为真,执行循环体;否则退出循环。
  3. 循环体n++
  4. 更新表达式x &= x - 1
  5. 重复步骤 2-4,直到 x == 0

具体执行过程(x = 4095):
初始值:

  • x = 4095(二进制:111111111111
  • n = 0

第 1 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 1
  3. 更新表达式x &= x - 1,即 x = 4095 & 4094
    • 4095 的二进制:111111111111
    • 4094 的二进制:111111111110
    • 按位与结果:111111111110,即 x = 4094

第 2 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 2
  3. 更新表达式x &= x - 1,即 x = 4094 & 4093
    • 4094 的二进制:111111111110
    • 4093 的二进制:111111111101
    • 按位与结果:111111111100,即 x = 4092

第 3 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 3
  3. 更新表达式x &= x - 1,即 x = 4092 & 4091
    • 4092 的二进制:111111111100
    • 4091 的二进制:111111111011
    • 按位与结果:111111111000,即 x = 4088

第 4 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 4
  3. 更新表达式x &= x - 1,即 x = 4088 & 4087
    • 4088 的二进制:111111111000
    • 4087 的二进制:111111110111
    • 按位与结果:111111110000,即 x = 4080

第 5 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 5
  3. 更新表达式x &= x - 1,即 x = 4080 & 4079
    • 4080 的二进制:111111110000
    • 4079 的二进制:111111101111
    • 按位与结果:111111100000,即 x = 4064

第 6 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 6
  3. 更新表达式x &= x - 1,即 x = 4064 & 4063
    • 4064 的二进制:111111100000
    • 4063 的二进制:111111011111
    • 按位与结果:111111000000,即 x = 4032

第 7 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 7
  3. 更新表达式x &= x - 1,即 x = 4032 & 4031
    • 4032 的二进制:111111000000
    • 4031 的二进制:111110111111
    • 按位与结果:111110000000,即 x = 3968

第 8 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 8
  3. 更新表达式x &= x - 1,即 x = 3968 & 3967
    • 3968 的二进制:111110000000
    • 3967 的二进制:111101111111
    • 按位与结果:111100000000,即 x = 3840

第 9 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 9
  3. 更新表达式x &= x - 1,即 x = 3840 & 3839
    • 3840 的二进制:111100000000
    • 3839 的二进制:111011111111
    • 按位与结果:111000000000,即 x = 3584

第 10 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 10
  3. 更新表达式x &= x - 1,即 x = 3584 & 3583
    • 3584 的二进制:111000000000
    • 3583 的二进制:110111111111
    • 按位与结果:110000000000,即 x = 3072

第 11 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 11
  3. 更新表达式x &= x - 1,即 x = 3072 & 3071
    • 3072 的二进制:110000000000
    • 3071 的二进制:101111111111
    • 按位与结果:100000000000,即 x = 2048

第 12 次循环:

  1. 条件判断x != 0 为真,进入循环。
  2. 循环体n++n 变为 12
  3. 更新表达式x &= x - 1,即 x = 2048 & 2047
    • 2048 的二进制:100000000000
    • 2047 的二进制:011111111111
    • 按位与结果:000000000000,即 x = 0

循环结束:

  • x = 0 时,x != 0 为假,退出循环。
  • 最终 n = 12

最终结果:

  • n = 12,即 4095 的二进制中有 121

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…

【Go语言基础【18】】Map基础

文章目录 零、概述一、Map基础1、Map的基本概念与特性2、Map的声明与初始化3、Map的基本操作 二、Map的底层实现三、Map的注意事项 零、概述 Map与其他语言的对比 特性Go mapJava HashMapPython dict并发安全非线程安全&#xff0c;需手动加锁非线程安全&#xff08;Concurre…

Qt客户端技巧 -- 窗口美化 -- 窗口阴影

不解析&#xff0c;直接给示例 窗口设为不边框且背景透明,好用来承载阴影 窗口一个Widget用来作真实窗口的作用&#xff0c;在真实窗口上加上阴影特效 上下两层Widget方式 main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidget…

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…

华为OD最新机试真题-流水线-OD统一考试(B卷)

题目描述: 有个工厂有m条 流水线,来并行完成n个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。 现给定流水线个数m,需要完成的作业数n,每个作业的处理时间分别为t1,.2..n。请你编程计算处理完所有作业的耗时为多少? 当n>m时

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…

项目css / js的兼容性next项目实践处理

之前写过一篇&#xff0c;但是没有css的处理&#xff0c;但是那一篇有几个文章蛮好的https://blog.csdn.net/SaRAku/article/details/144704916 css兼容性和js兼容性 1. 确定需要兼容的版本 先确定你们的兼容性版本&#xff0c;我们的兼容性以APP H5的兼容版本为最低兼容性&…

Vue3 + Vite 中使用 Lodash-es 的防抖 debounce 详解

Vue3 Vite 中使用 Lodash-es 的防抖(debounce)详解 在 Vue3 Vite 项目中&#xff0c;debounce 是 lodash-es 中最常用的功能之一&#xff0c;它可以帮助我们优化高频事件的处理。下面我将详细讲解 debounce 的使用方法&#xff0c;并提供一个完整的示例。 Debounce 核心概念…

MySQL--慢查询日志、日志分析工具mysqldumpslow

mysqldumpslow 常用参数&#xff1a; -s&#xff0c;是order的顺序----- al 平均锁定时间-----ar 平均返回记录时间-----at 平均查询时间&#xff08;默认&#xff09;-----c 计数-----l 锁定时间-----r 返回记录-----t 查询时间-t&#xff0c;是top n的意思&#xff0c;即为返…

C++课设:实现图书馆借阅记录系统(支持书籍管理、借阅功能、超期检测提醒)

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《编程项目实战》 目录 一、系统概述与设计思路1. 系统核心功能…

矩阵和向量范数的区别分析

文章目录 1. 研究对象本质差异2. 运算和作用方式不同3. 应用需求不同4. 数学性质和理论体系不同5. 几何直观不同6. 范数定义区别7. 范数计算方式区别8. 范数几何意义区别9. 范数相容性区别总结 1. 研究对象本质差异 向量本质&#xff1a;向量是具有大小和方向的一维有序数组&a…

HTMLCSS 学习总结

目录 ​​​一、HTML核心概念​​ ​​三大前端技术作用​​ ​​HTML基础结构​​ 开发工具&#xff1a;VS Code 专业配置​​​​安装步骤​​&#xff1a; ​​二、HTML标签大全&#xff08;含表格&#xff09;​​ ​​三、CSS核心技术​​ 1. 三种引入方式对比 2.…

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包

通过Cline使用智能体

文章目录 1、VS Code配置2、Cline使用2.1 工作模式2.2 MCP服务2.3 Cline支持的服务 3、案例一&#xff1a;天气查询项目3.1 需求说明3.2 申请高德API Key3.3 实操&#xff1a;向Cline下达命令 4、案例二&#xff1a;双城天气对比项目4.1 需求说明4.2 实操 Cline是VS Code的插件…

「混合开发」H5与原生App交互流程方案全面解析

目录 内嵌H5调用iOS内的方法 1. 背景 2. 解决方案 2.1 创建WebView 2.2 注册原生方法 2.3 H5调用原生方法 3. 序列图 H5 调用 Android&#xff1a;详细指南 整体流程 每一步的详细说明 步骤1&#xff1a;在Android项目中设置WebView 步骤2&#xff1a;定义JavaScri…

webpack打包vue项目

要在 Vue 项目中使用 Webpack 进行打包&#xff0c;通常有几种不同的方式来设置你的项目。以下是基本步骤&#xff1a; 1. 使用 Vue CLI 创建项目&#xff08;推荐&#xff09; Vue CLI 是官方提供的一个脚手架工具&#xff0c;它内置了对 Webpack 的支持&#xff0c;并且简化…

Linux环境-通过命令查看zookeeper注册的服务

假设前置条件如下&#xff1a; 1.root权限用户名&#xff1a;zookeeper 2.zookeeper所在服务器地址&#xff1a;168.7.3.254&#xff08;非真实ip&#xff09; 3.zookeeper的bin文件路径&#xff1a;/opt/zookeeper/bin 4.确保zookeeper注册中心已启动 查看注册中心服务如下&a…

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…

ArcGIS计算多个栅格数据的平均栅格

3种方法计算多个栅格数据的平均栅格 1->使用“ 栅格计算器”工具 原理就是把多幅影像数据相加&#xff0c;然后除以个数&#xff0c;就能得到平均栅格。 2-> 使用“像元统计数据”工具&#xff0c;如果是ArcGIS pro&#xff0c;则是“像元统计”工具。使用这个工具可以…