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);
}
目录
相关文章
|
存储 自然语言处理 程序员
【维生素C语言】第十八章 - C语言程序环境
程序环境是什么?我们都 "经历" 过,但不曾感知到 "他" 的存在。我们其实在不知不觉中早就已经接触到了程序环境…… 第一次创建了一个文件(test.c),敲下那句 "hello world" 随后保存后点击运行后编译出可执行文件(test.exe)时,其实就已经接触到了 "他" 了。
107 0
【维生素C语言】第十八章 - C语言程序环境
|
C语言
明解C语言第七章习题
明解C语言第七章习题
|
C语言
明解C语言第八章习题
明解C语言第八章习题
|
C语言
明解C语言第五章习题
明解C语言第五章习题
|
存储 C语言
明解C语言第六章习题
明解C语言第六章习题
|
C语言
明解C语言第四章习题
明解C语言第四章习题
|
数据安全/隐私保护 C语言
C语言第四章 分支结构程序设计习题2【修改版,看水印】
C语言第四章 分支结构程序设计习题2【修改版,看水印】
179 0
C语言第四章 分支结构程序设计习题2【修改版,看水印】
|
算法
C程序设计语言第二版习题2-9
在求反码时,表达式 x &= (x - 1) 用于把x最右边的值为1的位删除掉。请解释一下这样做的道理。用这一方法重写bitcount函数 ,使之执行得更快一点
838 0
C程序设计语言第二版习题4-1
编写一个函数strrindex(s, t),用于返回字符串t在s中最右出现的位置,如果 s中不 包含t,那么返回-1。
3699 0
|
机器学习/深度学习 算法 JavaScript
C程序设计语言第二版习题3-5
编写函数itob(n, s, b) ,用于把整数n转换成以b为基数的字符串并存到字符串s中。例如, itob(n, s, 16) 表示将n转换成16进制数,并存入s中。
999 0