問題描述
編寫一個函數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));
}