位置 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;
}