課題
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