K&R演習[2-6]

課題

位置pから始まるnビットをyの右端のnビットにセットし、他のビットはそのままにしたxを返す関数setbits(x, p, n, y)を書け。

回答

#include <stdio.h>

unsigned setbits(unsigned x, int p, int n, unsigned y);

/*
 * @fn      Main
 * @brief   
 * @param
 * @return
 * @note
 */
int main(void)
{
    int tmp = setbits(65535, 4, 3, 0);
    printf("%d\n", tmp);
}

/*
 * @fn      setbits
 * @brief   xの位置pから始まるnビットをyの右端のnビットにセットし、他のビットはそのままにしたxを返す
 * @param   x
 * @return
 * @note
 */
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
    // xの位置pから始まるnビットの抽出
    int tmp = (x >> (p + 1 - n)) & (~(~0 << n));

    // yの右端のnビットにセットし、他のビットはそのままにしたxを求める
    x = (y & (~0 << n)) + tmp;

    return x;
}

実行結果

7