天天看點

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));
}           

繼續閱讀