プログラミング言語 C 2.6


位置 pから始まる nビットに yの右端の nビットをセットして、他は
ビットはそのままにした xを返す setbits(x, p, n, y)を書け、という問題。
何か問題の日本語おかしい気がするのは、僕の語彙力の問題なんですかね〜?

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

static unsigned int setbits(unsigned int x, int p, int n, unsigned int y);
static void test_setbits();

int
main(void)
{
     unsigned int answer;

     test_setbits();
     answer = setbits(12, 1, 2, 3);
     printf("answer is %d\n", answer);

     return 0;
}

static void
test_setbits()
{
     assert(setbits(0, 0, 1, 1) == 1);
     assert(setbits(1, 0, 1, 0) == 1);
     assert(setbits(240, 3, 4, 15) == 255);
     assert(setbits(195, 5, 4, 15) == 255);
}

static unsigned int
setbits(unsigned int x, int p, int n, unsigned int y)
{
     unsigned int mask_x;
     unsigned int mask_y;
     unsigned int tmp;

     tmp = (x >> (p + 1 - n)) & ~(~0 << n);
     tmp = tmp << (p + 1 - n);
     x = x ^ tmp;

     mask_y = ~(~0 << n);
     mask_x = (mask_y) << (p + 1- n);

     return x | mask_x;
}