K&R演習[2-7]

課題

xのビット位置pからnビットを反転し、他のビットはそのままにしたxをかえす関数invert(x,p,n)を書け。

回答

#include <stdio.h>

unsigned invert(unsigned x, int p, int n);

/*
 * @fn      Main
 * @brief   
 * @param
 * @return
 * @note
 */
int main(void)
{
    unsigned x, ret;

    x = 65535;  ret = invert(x,  4, 3);     printf("%d, %d\n", x, ret);
    x = 65535;  ret = invert(x, 14, 4);     printf("%d, %d\n", x, ret);
}

/*
 * @fn      invert
 * @brief   
 * @param   
 * @return
 * @note
 */
unsigned invert(unsigned x, int p, int n)
{
    unsigned ret, d1, d2;

    // xの反転
    unsigned invert_x = ~x;

    // xの位置pからnビットを0にする
        // 位置pからnビットが0で、それ以外が1のデータを用意する
        unsigned tmp = ((~0) << (p + 1)) + ~((~0) << (p + 1 - n));

        // xにかける
        d1 = x & tmp;

    // xの反転の位置pからnビット以外を0にする
        // 位置pからnビットが1で、それ以外が0のデータを用意する
        tmp = ~tmp;

        // xの反転にかける
        d2 = (~x) & tmp;

    ret = d1 + d2;

    return ret;
}

実行結果

65535, 65507
65535, 34815