演習2-7 K&R プログラミング言語C

演習2-7

/*
 * x : 62        => 0011 1110
 * p : 6
 * n : 3
 *
 *  x反転        => 1100 0001
 *  mask         => 0111 0000
 *  vmask        => 1000 1111
 *
 *  x vmasked    => 0000 1110
 *  x反転 masked => 0100 0000
 *  OR
 *               => 0100 1110 => 78
 */

#include <stdio.h>

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

int main(int argc, char *argv[])
{
    unsigned int x;
    int p, n;

    x = 62; /* 0011 1110 */
    p = 6;
    n = 3;

    printf("x:%u\np:%d\nn:%d\nresult:%u\n", x, p, n, invert(x, p, n));
    return 0;
}

unsigned invert(unsigned x, int p, int n)
{
    /* m: マスク */
    unsigned m, v;
    m = ~(~0 << n) << (p + 1 - n); /* 0111 0000 */
    v = ~m; /* 1000 1111 */
    return (x & v) | (~x & m);
}

実行結果

$ ./ex2-7
x:62
p:6
n:3
result:78
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»