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

问题描述

编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。

问题分解

  • 主函数main
  • 核心函数 setbits(x, p ,n, y), 此函数是算法核心,要做的事情就是通过一系列的位运算达到目的。大概分为以下几个步骤:

    • 假设x = X7X6X5X4X3X2X1X0, p = 4, n = 3, y = Y7Y6Y5Y4Y3Y2Y1Y0, 那么根据题意,我们期望得到的结果应该是 : X7X6X5Y2Y1Y0X1X0
    • 分析 X7X6X5Y2Y1Y0X1X0 ,可以由 X7X6X5000X1X0 | 000 Y2Y1Y0 00 得到,因此我们接下来要想办法求得 X7X6X5000X1X0 和 000 Y2Y1Y0 00
    • 求 X7X6X5 000 X1X0 : x & (~(~(~0 << n) << (p - n + 1)))
    • 求 000 Y2Y1Y0 00 : (y & ~(~0 << n)) << (p - n + 1)
    • 所以结果为 (x & (~(~(~0 << n) << (p - n + 1)))) | ((y & ~(~0 << n)) << (p - n + 1))

代码实现

#include<stdio.h>
​
unsigned setbits(unsigned x, int p, int n, unsigned y);
​
int main()
{
  unsigned x, y, r;
  int p, n;
  x = 21;
  y = 9;
  p = 4;
  n = 3;
  r = setbits(x, p, n, y);
  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));
}
上一篇:C# 获取磁盘空间大小的方法


下一篇:枚举去除大量if-else if -else优化记录