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;
}
程序解释:
- 输入:程序从标准输入读取一个整数
x
。 - 统计二进制中1的个数:
- 使用
for
循环,初始条件为n = 0
。 - 循环条件为
x != 0
。 - 每次循环,
x
更新为x &= x - 1
,这一步会去掉x
的二进制表示中最低位的1
。 - 每次循环,
n
增加1
,表示找到一个1
。
- 使用
- 输出:循环结束后,输出
n
,即x
的二进制表示中1
的个数。
当我们输入 3
时,程序的运行步骤和变量变化如下:
初始状态:
x = 3
(输入的十进制数)n = 0
(用于统计二进制中1
的个数)
二进制表示:
3
的二进制表示为11
。
运行步骤:
-
第一次循环:
x = 3
(二进制:11
)x - 1 = 2
(二进制:10
)x &= x - 1
即3 & 2
,结果为2
(二进制:10
)n++
,n
从0
变为1
-
第二次循环:
x = 2
(二进制:10
)x - 1 = 1
(二进制:01
)x &= x - 1
即2 & 1
,结果为0
(二进制:00
)n++
,n
从1
变为2
-
循环结束:
x = 0
,循环条件x != 0
不满足,退出循环
最终状态:
x = 0
n = 2
输出结果:
程序输出 2
,表示 3
的二进制表示中有 2
个 1
。
总结:
- 输入
3
,其二进制为11
,包含2
个1
。 - 程序通过
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;
}
执行步骤
-
初始化:
x
被赋值为3(假设用户输入3)。n
被初始化为0。
-
for
循环的执行顺序:for
循环的语法是:for (初始化; 条件; 更新) { 循环体 }
- 在每次循环开始时,首先检查条件(
x != 0
),如果条件为真,则执行循环体,然后执行更新部分(x &= x - 1
),接着再次检查条件,以此类推。
-
第一次循环:
- 条件检查:
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。
- 条件检查:
-
第二次循环:
- 条件检查:
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。
- 条件检查:
-
第三次循环:
- 条件检查:
x != 0
(0 != 0),条件为假,循环结束。
- 条件检查:
变量变化
循环次数 | x 的二进制 | x 的十进制 | n 的值 |
---|---|---|---|
初始化 | 0b11 | 3 | 0 |
第一次 | 0b10 | 2 | 1 |
第二次 | 0b00 | 0 | 2 |
最终输出
程序最终输出 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++;
}
- 初始化:
n = 0
。 - 条件判断:检查
x != 0
。如果为真,执行循环体;否则退出循环。 - 循环体:
n++
。 - 更新表达式:
x &= x - 1
。 - 重复步骤 2-4,直到
x == 0
。
具体执行过程(x = 4095
):
初始值:
x = 4095
(二进制:111111111111
)n = 0
第 1 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为1
。 - 更新表达式:
x &= x - 1
,即x = 4095 & 4094
。4095
的二进制:111111111111
4094
的二进制:111111111110
- 按位与结果:
111111111110
,即x = 4094
。
第 2 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为2
。 - 更新表达式:
x &= x - 1
,即x = 4094 & 4093
。4094
的二进制:111111111110
4093
的二进制:111111111101
- 按位与结果:
111111111100
,即x = 4092
。
第 3 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为3
。 - 更新表达式:
x &= x - 1
,即x = 4092 & 4091
。4092
的二进制:111111111100
4091
的二进制:111111111011
- 按位与结果:
111111111000
,即x = 4088
。
第 4 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为4
。 - 更新表达式:
x &= x - 1
,即x = 4088 & 4087
。4088
的二进制:111111111000
4087
的二进制:111111110111
- 按位与结果:
111111110000
,即x = 4080
。
第 5 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为5
。 - 更新表达式:
x &= x - 1
,即x = 4080 & 4079
。4080
的二进制:111111110000
4079
的二进制:111111101111
- 按位与结果:
111111100000
,即x = 4064
。
第 6 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为6
。 - 更新表达式:
x &= x - 1
,即x = 4064 & 4063
。4064
的二进制:111111100000
4063
的二进制:111111011111
- 按位与结果:
111111000000
,即x = 4032
。
第 7 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为7
。 - 更新表达式:
x &= x - 1
,即x = 4032 & 4031
。4032
的二进制:111111000000
4031
的二进制:111110111111
- 按位与结果:
111110000000
,即x = 3968
。
第 8 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为8
。 - 更新表达式:
x &= x - 1
,即x = 3968 & 3967
。3968
的二进制:111110000000
3967
的二进制:111101111111
- 按位与结果:
111100000000
,即x = 3840
。
第 9 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为9
。 - 更新表达式:
x &= x - 1
,即x = 3840 & 3839
。3840
的二进制:111100000000
3839
的二进制:111011111111
- 按位与结果:
111000000000
,即x = 3584
。
第 10 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为10
。 - 更新表达式:
x &= x - 1
,即x = 3584 & 3583
。3584
的二进制:111000000000
3583
的二进制:110111111111
- 按位与结果:
110000000000
,即x = 3072
。
第 11 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为11
。 - 更新表达式:
x &= x - 1
,即x = 3072 & 3071
。3072
的二进制:110000000000
3071
的二进制:101111111111
- 按位与结果:
100000000000
,即x = 2048
。
第 12 次循环:
- 条件判断:
x != 0
为真,进入循环。 - 循环体:
n++
,n
变为12
。 - 更新表达式:
x &= x - 1
,即x = 2048 & 2047
。2048
的二进制:100000000000
2047
的二进制:011111111111
- 按位与结果:
000000000000
,即x = 0
。
循环结束:
- 当
x = 0
时,x != 0
为假,退出循环。 - 最终
n = 12
。
最终结果:
n = 12
,即4095
的二进制中有12
个1
。
相关文章:
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; }程序解释: 输入:程序从标…...

实现Cursor + Pycharm 交互
效果演示: 直接可以在cursor或Pycharm中点击右键点击,然后就可以跳转到另一个应用的对应位置了 使用方法: 分别在两个应用中安装插件【Switch2Cursor Switch2IDEA,这两个插件分别安装在 IDEA 和 Cursor 中】: Switc…...

C++标准模板库
C标准库参考: C 标准库-CSDN博客 标准模板库STL C 标准库 和 STL 的关系 1. 严格来说,STL ≠ C 标准库 STL(Standard Template Library) 是 C 标准库的一个子集,主要提供泛型编程相关的组件(如容器、迭代器…...

dvwa6——Insecure CAPTCHA
captcha:大概是“我不是机器人”的一个勾选框或者图片验证 LOW: 先输入密码正常修改试一下(123),发现报错 查看源码: <?phpif( isset( $_POST[ Change ] ) && ( $_POST[ step ] 1 ) ) {// Hide the C…...
【机器学习及深度学习】机器学习模型的误差:偏差、方差及噪声
机器学习模型的误差分析 V1.0机器学习模型的衡量准则概念引入机器学习模型误差分析误差出现的原因及消除 V1.0 机器学习模型的衡量准则 衡量机器学习模型的好坏可以考虑以下几个方面: 偏差(Bias): 在充分训练的情况下࿰…...

【学习笔记】On the Biology of a Large Language Model
On the Biology of a Large Language Model 1 Introduction 目标是对这些模型的内部工作机制进行逆向工程,从而更好地理解它们,并评估它们是否适合特定用途。 正如细胞是生物系统的基本构建单元,我们假设特征是模型内部计算的基本单位。仅仅…...

飞腾D2000,麒麟系统V10,docker,ubuntu1804,小白入门喂饭级教程
#下载docker Index of linux/static/stable/ 根据电脑的CPU类型选择: Intel和AMD选x86_64飞腾D2000选aarch64 #选择较新的版本 #在包含下载的docker-XX.X.X.tgz的文件夹中右键->打开终端 # 解压安装包(根据实际下载的文件) tar -zxvf …...

星野录(博客系统)测试报告
目录 一. 项目背景 二、项目功能 三、测试计划 1. 功能测试 1.1 测试用例 1.2 执行测试部分操作截图 2. 使用selenium进行自动化测试 2.1 添加相关依赖 2.2 登录页面测试 3.3 注册页面测试 3.4 博客列表页面测试 3.5 博客详情页测试 3.6 博客编辑页面测试 3.7 个人…...

使用 Java 实现一个简单且高效的任务调度框架
目录 一、任务调度系统概述 (一)任务调度的目标 (二)任务调度框架的关键组成 二、任务状态设计 (一)任务状态流转设计 (二)任务表设计(SQL) 三、单机任务调度实现 (一)获取待处理任务 (二)执行任务 代码实现(单线程版本) (三)多线程提高吞吐量 四…...

2022—2025年:申博之路及硕士阶段总结
文章目录 1 前景概要2 打造神兵利器2.1 夺天地之精2.2 锻兵魂之形2.3 契人兵之命 3 潜心闭关修炼3.1 第一阶段:苦心智3.2 第二阶段:劳筋骨3.3 第三阶段:摧意志 4 突破晋级4.1 突破失败4.2 聚气凝神4.3 心魔再现4.4 新起点 5 回顾及深思 1 前景…...

项目执行中缺乏灵活应对机制,如何增强适应性?
项目执行中缺乏灵活应对机制可以通过建立风险预警机制、培养团队快速响应能力、制定动态调整方案、加强团队沟通协作、引入敏捷管理理念来增强适应性。 其中,培养团队快速响应能力尤为重要。这种能力意味着当项目遇到突发状况时,团队能迅速评估问题、确定…...

Agentic Workflow是什么?Agentic Workflow会成为下一个AI风口吗?
无论是想要学习人工智能当做主业营收,还是像我一样作为开发工程师但依然要运用这个颠覆开发的时代宠儿,都有必要了解、学习一下人工智能。 近期发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,入行门槛低&#x…...
大模型模型推理的成本过高,如何进行量化或蒸馏优化
在人工智能的浪潮中,大模型已经成为推动技术革新的核心引擎。从自然语言处理到图像生成,再到复杂的多模态任务,像GPT、BERT、T5这样的庞大模型展现出了惊人的能力。它们在翻译、对话系统、内容生成等领域大放异彩,甚至在医疗、金融等行业中也开始扮演重要角色。可以说,这些…...

BUUCTF[极客大挑战 2019]EasySQL 1题解
[极客大挑战 2019]EasySQL题解 分析解题过程漏洞原理分析明确注入点:尝试万能密码法法一法二 总结 分析 从题目分析,这道题应该与SQL注入有关,启动靶机之后,访问url是一个登录界面,随便输入用户名密码之后࿰…...
Css样式中设置gap: 12px以后左右出现距离问题解析
原因核心: 虽然写的是: display: flex; gap: 12px;但在实际 DOM 中,这段结构: <div class"el-form-item__content"><div class"el-input"><input type"text" class"el-inpu…...
MySQL问题:count(*)与count(1)有什么区别
Count(1)查询过程 如果表里只有主键索引,没有二级索引时,InnoDB循环遍历主键索引,将读取到的记录返回给Server层,但是不会读取记录中的任何字段的值,因为count函数的参数是1,不是字…...

大模型 提示模板 设计
大模型 提示模板 设计 论文介绍:LangGPT - 从编程语言视角重构大语言模型结构化可复用提示设计框架 核心问题: 现有提示工程缺乏结构化设计模板,依赖经验优化,学习成本高且复用性低,难以支持提示的迭代更新。 创新思路: 受编程语言的结构化和可复用性启发,提出LangGP…...

excel表格记账 : 操作单元格进行加减乘除 | Excel中Evaluate函数
文章目录 引用I 基础求和∑II Excel中Evaluate函数基于字符串表达式进行计算用法案例 :基于Evaluate实现汇率计算利润知识扩展在单元格内的换行选择整列单元格引用 需求: 基于汇率计算利润,调整金额以及进汇率和出汇率自动算出利润,已经统计总利润。 基于Evaluate实现汇率计…...

20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s
20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s 2025/6/2 18:15 缘起:有些时候,需要在uboot阶段做一些事情。 于是,希望在荣品的PRO-RK3566开发板的Android13下的uboot启动停下。 1、【原始的LOGÿ…...
如何合理设计缓存 Key的命名规范,以避免在共享 Redis 或跨服务场景下的冲突?
设计合理的缓存 Key 命名规范对于避免冲突、提高可维护性和可读性至关重要,尤其是在共享 Redis 实例或跨服务调用的场景下。 以下是一个推荐的缓存 Key 命名规范和设计思路: 一、核心原则 唯一性 (Uniqueness): 这是最重要的原则,确保不同…...
Trae CN IDE自动生成注释功能测试与效率提升全解析
Trae CN IDE 的自动注释功能可以通过 AI 驱动的代码分析生成自然语言注释,以下是具体测试方法和优势总结: 一、Python 代码注释生成测试 1. 测试环境 IDE:Trae CN IDE(需确认支持 Python)代码示例: def …...
让AI弹琴作曲不再是梦:Python+深度学习玩转自动化音乐创作
让AI弹琴作曲不再是梦:Python+深度学习玩转自动化音乐创作 一、AI也能谱出动人的旋律?真不是科幻! 还记得小时候学钢琴时老师的那句经典:“感觉不到情绪的乐句,是没灵魂的。” 当时我一边练琴一边想:要是有个机器能帮我写谱、调性又不跑调就好了! 结果几年后,真被我碰…...
C++概率论算法详解:理论基础与实践应用
清言神力,创作奇迹。接受福利,做篇笔记。 参考资料 [0] 概率论中均值、方差、标准差介绍及C/OpenCV/Eigen的三种实现. https://blog.csdn.net/fengbingchun/article/details/73323475. [4] C中的随机数及其在算法竞赛中的使用 - 博客园. https://www.…...

ssh登录wsl2
1. ssh服务重新安装 Ubuntu20.04子系统自带的ssh服务无法连接,需卸载后重新安装。 sudo apt-get remove openssh-server sudo apt-get install openssh-server2. 修改配置信息 sudo vim /etc/ssh/sshd_config修改内容: # 最好一模一样 Port 33 # 这…...

黑马Java面试笔记之 消息中间件篇(Kafka)
一. Kafka保证消息不丢失 Kafka如何保证消息不丢失 使用Kafka在消息的收发过程中都会出现消息丢失,Kafka分别给出了解决方案 生产者发送消息到Brocker丢失消息在Brocker中存储丢失消费者从Brocker接收消息丢失 1.1 生产者发送消息到Brocker丢失 设置异步发送 消息…...
LeetCode - 234. 回文链表
目录 题目 快慢双指针步骤 读者可能的错误写法 正确的写法 题目 234. 回文链表 - 力扣(LeetCode) 快慢双指针步骤 找到链表的中点(find_mid函数): 使用快慢指针,慢指针每次走一步,快指针…...

PYTHON通过VOSK实现离线听写支持WINDOWSLinux_X86架构
在当今人工智能快速发展的时代,语音识别技术已经成为人机交互的重要方式之一。本文将介绍如何使用Python结合Vosk和PyAudio库实现一个离线语音识别系统,无需依赖网络连接即可完成语音转文字的功能。 技术栈概述 1. Vosk语音识别引擎 Vosk是一个开源的…...
nginx+tomcat动静分离、负载均衡
一、理论 nginx用于处理静态页面以及做调度器,tomcat用于处理动态页面 lvs(四层) 轮询(rr) 加权轮询(wrr) 最小连接(lc) 加权最小连接(wlc) ngi…...
SQL进阶之旅 Day 13:CTE与递归查询技术
【SQL进阶之旅 Day 13】CTE与递归查询技术 引言 欢迎来到“SQL进阶之旅”的第13天!今天我们重点探讨的是CTE(公用表表达式)与递归查询技术。CTE是现代SQL中的一个重要特性,能够极大地提高复杂查询的可读性与维护性。而递归CTE则…...
【PmHub面试篇】Gateway全局过滤器统计接口调用耗时面试要点解析
你好,欢迎来到本次关于Gateway全局过滤器统计接口调用耗时的面试系列分享。在这篇文章中,我们将深入探讨这一技术领域的相关面试题预测。若想对相关内容有更透彻的理解,强烈推荐参考之前发布的博文:【PmHub后端篇】PmHub Gateway全…...