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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86474.shtml
英文地址,請注明出處:http://en.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;則是“像元統計”工具。使用這個工具可以…