プログラミング言語 C 2.7


xのビット位置 pから nビットを反転する関数 invert(x, p, n)を書けと
いう問題。print_binaryというのは 2進数で表示する関数です。

#include <stdio.h>
#include <assert.h>
#include "util.h"

static unsigned int invert(unsigned x, int p, int n);
static void test_invert(void);

int
main (void)
{
     int answer = 0;

     test_invert();

     print_binary(0xffff);
     print_binary(invert(0xffff, 13, 5));

     return 0;
}

static void
test_invert()
{
     assert(invert(0, 0, 1) == 1);
     assert(invert(1, 0, 1) == 0);
     assert(invert(0xff, 7, 8) == 0);
     assert(invert(0, 7, 8) == 0xff);
     assert(invert(0xffff, 15, 16) == 0);
     assert(invert(0, 15, 16) == 0xffff);
     assert(invert(51, 3, 2) == 0x3f);
}

static unsigned int
invert(unsigned x, int p, int n)
{
     unsigned int tmp;

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

     return x ^ tmp;
}