2013年4月13日土曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第2章(データ型・演算子・式)、2.9(ビットごとの論理演算子)の演習 2-6、2-7、2-8を解いてみる。

その他参考書籍

演習 2-6, 2-7, 2-8.

コード

sample.c

#include <stdio.h>

unsigned setbits(unsigned x, int p, int n, unsigned y);
unsigned invert(unsigned x, int p, int n);
unsigned rightrot(unsigned x, int n);

int main()
{
    /* 2進数 101010 10進数 42*/
    unsigned x = 052;
    /* 2進数 010110 10進数 22*/
    unsigned y = 026;
    int p = 4, n = 2;

    printf("%d, %d, %d, %d\n", x, y, p, n);

    /* 2進数 110010 10進数 50 */
    printf("%d\n", setbits(x, p, n, y));
    /* 2進数 010110 10進数 22 */
    printf("%d\n", setbits(y, p, n, x));

    /* 2進数 110010 10進数 50 */
    printf("%d\n", invert(x, p, n));
    /* 2進数 001110 10進数 14 */
    printf("%d\n", invert(y, p, n));
    
    /* 以下全部同じ値になる */
    printf("%d\n", rightrot(5, 2));
    printf("%d\n", rightrot(10, 3));
    printf("%d\n", rightrot(20, 4));
    printf("%d\n", rightrot(40, 5));
    
    /* 2進数 101010 10進数 42 */
    printf("%d\n", rightrot(x, 0));
    /* 2進数 010110 10進数 22 */
    printf("%d\n", rightrot(y, 0));
    return 0;
}

unsigned setbits(unsigned x, int p, int n, unsigned y)
{
    return (x & ~(~(~0 << n) << (p + 1 - n))) | 
           ((y & ~(~0 << n)) << (p + 1 - n));
}

unsigned invert(unsigned x, int p, int n)
{
    return x ^ (~(~0 << n) << (p + 1 - n));
}

unsigned rightrot(unsigned x, int n)
{
    int cols;
    unsigned a = (unsigned) ~0;
    for (cols = 1; (a = a >> 1) > 0; cols++);
    while (n > 0) {
        a = (x & 1) << (cols - 1);
        x = x >> 1;
        x = x | a;
        n--;
    }
    return x;
}

入出力結果(Terminal)

$ ./a.out
42, 22, 4, 2
50
22
50
14
1073741825
1073741825
1073741825
1073741825
42
22
$

0 コメント:

コメントを投稿