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

简介: 编写一个函数 invert(x, p, n),该函数返回对 x 执行下列操作后的结果值:将 x 中从第 p 位开始的 n 个(二进制)位求反(即,1 变成 0,0 变成 1),x 的其余各位保持不变。

问题描述

编写一个函数 invert(x, p, n),该函数返回对 x 执行下列操作后的结果值:将 x 中从第 p 位开始的 n 个(二进制)位求反(即,1 变成 0,0 变成 1),x 的其余各位保持不变。

问题分解

  • 主函数main
  • 工具函数 setbits(x,p,n,y), 算法解析可以看上一篇文章
  • 核心函数 invert(x, p ,n)。 这道题其实不难,只要联想一下2-6解决的问题,即可快速得到答案。我们来回顾一下2-6解决的问题:编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。 可以发现,我们只要拿到一个y,满足y的最右边的n位的值正是 x 中需要求反的位即可。因此算法描述可以为:

    1. 求得x的指定位求反并右移至尾部: (~x >> (p - n + 1)) & ~(~0 << n)
  1. 调用setbits 即可求得

代码实现

#include<stdio.h>
​
unsigned setbits(unsigned x, int p, int n, unsigned y);
unsigned invert(unsigned x, int p, int n);
​
int main()
{
  unsigned x, r;
  int p, n;
  x = 21;
  p = 4;
  n = 3;
  r = invert(x, p, n);
  printf("The result is: %u \n", r);
  return 0;
}
​
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
  return (x & (~(~(~0 << n) << (p - n + 1)))) | ((y & ~(~0 << n)) << (p - n + 1));
}
​
​
unsigned invert(unsigned x, int p, int n)
{
    unsigned y;
    y = (~x >> (p - n + 1)) & ~(~0 << n); 
    return setbits(x, p, n, y);
}
目录
相关文章
|
机器学习/深度学习 人工智能 算法
|
9月前
|
人工智能 Dart IDE
SonarQube Server 10.8 发布,新增功能概览
SonarQube Server 10.8 发布,新增功能概览
229 5
SonarQube Server 10.8 发布,新增功能概览
|
11月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
2209 0
高精度算法(加、减、乘、除,使用c++实现)
|
11月前
|
Web App开发 缓存 前端开发
拿下奇怪的前端报错(六):多摄手机webrtc拉取视频流会导致应用崩溃,从而无法进行人像扫描
本文介绍了一种解决手机摄像头切换导致应用崩溃的问题的方法。针对不支持facingMode配置的四摄手机,通过缓存和序号切换的方式,确保应用在特定设备上不会频繁崩溃,提升用户体验。
306 1
|
数据安全/隐私保护 Python
找回SecureCRT密码
找回SecureCRT密码
285 0
|
机器学习/深度学习
离散数学_十章-图 ( 2 ):图的术语和几种特殊的图(二)
离散数学_十章-图 ( 2 ):图的术语和几种特殊的图(二)
4368 0
|
数据可视化 前端开发 JavaScript
可视化图形语法简介
在BI产品中,图表绘制一般分为两种流派,常见以分类学比如Excel选择图表分类,还有一种是图形语法。作为BI产品经理都要有所了解,下面是阿里云数据库前端团队对图形语法的大致介绍。
600 2
|
存储 编译器
二进制程序是什么意思?底层原理是什么?
二进制程序是什么意思?底层原理是什么?
1383 0
|
消息中间件 存储 Prometheus
Prometheus 监测 RocketMQ 最佳实践
Prometheus 集成的 50 多款云产品中,RocketMQ 在可观测方面实现了非常完善的功能,是一个特别具有代表性的云产品。
Prometheus 监测 RocketMQ 最佳实践
|
IDE 开发工具
C - error: converting to execution character set:Illegal byte sequence
C - error: converting to execution character set:Illegal byte sequence
1558 0
C - error: converting to execution character set:Illegal byte sequence