C程序设计语言第二版习题2-9

简介: 在求反码时,表达式 x &= (x - 1) 用于把x最右边的值为1的位删除掉。请解释一下这样做的道理。用这一方法重写bitcount函数 ,使之执行得更快一点

问题描述

在求反码时,表达式 x &= (x - 1) 用于把x最右边的值为1的位删除掉。请解释一下这样做的道理。用这一方法重写bitcount函数 ,使之执行得更快一点

问题分解

  • 主函数main
  • 核心函数 bitcount(x)。我们先来看看书中例子 bitcount的算法实现:
int bitcount(unsigned x)
{
  int b;
  for(b = 0; x != 0; x >>= 1)
  {
    if(x & 1)
      b++;
  }
  return b;
}

从以上代码可知, bitcount 的实现逻辑是根据任何数与1进行位与计算可判断出次数的最右侧是否为1, 根据此原理不断将x右移,妹出现一次1记录一次。 根据题意,我们现在要改造bitcount的实现方式,借用 x &= (x - 1) 。如何理解呢? 我们知道二进制的特性, 不是0 就是1, 所以x & x - 1操作后的最右边值一定是互反的, 这样,x & (x - 1)的最右边的值一定为0,如此循环后x的最终值为0,循环次数即为x中值为1的个数。

代码实现


#include<stdio.h>
int bitcount(unsigned x);
​
int main()
{
  unsigned x;
  int r;
  x = 3;
  r = bitcount(x);
  printf("The result is: %u \n", r);
  return 0;
}
​
//使用求反码的方式 
int bitcount(unsigned x)
{
  int b;
  for(b = 0; x != 0; b++)
  {
    x &= (x - 1);
  }
  return b;
}

对比两个bitcount函数,我们发现第一个bitcount 中,for每执行一次,比第二个的bitcount 多执行了一次位与(&)操作,因此可以说第二个bitcount的执行速度是更快的。

目录
相关文章
|
Web App开发 编解码 Android开发
2023年音视频开发知识技术合集(基础入门到高级进阶)
2023年音视频开发知识技术合集(基础入门到高级进阶)
|
Ubuntu 安全 Linux
Ubuntu零基础教程
Ubuntu零基础教程
686 0
|
存储 算法 开发者
JPEG(上)| 学习笔记
快速学习JPEG(上),介绍了 JPEG(上)系统机制, 以及在实际应用过程中如何使用。
JPEG(上)| 学习笔记
|
4天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
324 102
|
4天前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;
|
5天前
|
缓存 JavaScript 前端开发
JavaScript 的三种引入方法详解
在网页开发中,JavaScript 可通过内联、内部脚本和外部脚本三种方式引入 HTML 文件,各具适用场景。本文详解其用法并附完整示例代码,帮助开发者根据项目需求选择合适的方式,提升代码维护性与开发效率。
197 110
|
5天前
|
Android开发 开发者 Windows
这是我设计的一种不关机,然后改造操作系统的软件设计思路2.0版本
本文介绍了在不重启系统的情况下实现操作系统改造的两种方案。第一种方案通过SLFM Recovery模式,在独立于操作系统的最高权限环境下完成系统更新与改造,并支持断电恢复与失败回滚。第二种方案采用多分区机制,通过SLFM套件在独立分区中完成系统改造,适用于可中断与不可中断服务场景,确保系统更新过程的安全与稳定。
230 132