问题描述
编写一个函数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));
}