プログラミング+α学習ブログ

勉強したことの備忘録です。

0〜UINT_MAXを2進・8進・10進・16進で表示するプログラム

#include <stdio.h>
#include <limits.h>

/*--- 整数x中のセットされたビット数を返す ---*/
int count_bits(unsigned x)
{
    int count = 0;
    while (x) {
        if (x & 1U) count++;
        x >>= 1;
    }
    return (count);
}

/*--- unsigned型のビット数を返す ---*/
int int_bits(void)
{
    /* 整数x中のセットされたビット数 */
    return (count_bits(~0U));
}

/*--- unsigned型のビット内容を表示 ---*/
void print_bits(unsigned x)
{
    int i;
    /* unsigned型のビット数 */
    for (i = int_bits() - 1; i >= 0; i--)
        putchar(((x >> i) & 1U) ? '1' : '0');
}

int main(void)
{
    unsigned i; // int型は不可
    
    for (i = 0; i < UINT_MAX; i++) {
        /* unsigned型のビット内容を表示(2進) */
        print_bits(i);
        printf(" %6o %5u %4X\n", i, i, i);  // 8進・10進・16進
    }
    
    return (0);
}

実行結果

00000000000000000000000000000000      0     0    0
00000000000000000000000000000001      1     1    1
00000000000000000000000000000010      2     2    2
00000000000000000000000000000011      3     3    3
00000000000000000000000000000100      4     4    4
00000000000000000000000000000101      5     5    5
00000000000000000000000000000110      6     6    6
00000000000000000000000000000111      7     7    7
00000000000000000000000000001000     10     8    8
00000000000000000000000000001001     11     9    9
00000000000000000000000000001010     12    10    A
00000000000000000000000000001011     13    11    B
00000000000000000000000000001100     14    12    C
00000000000000000000000000001101     15    13    D
00000000000000000000000000001110     16    14    E
00000000000000000000000000001111     17    15    F
00000000000000000000000000010000     20    16   10
00000000000000000000000000010001     21    17   11
00000000000000000000000000010010     22    18   12
00000000000000000000000000010011     23    19   13
00000000000000000000000000010100     24    20   14
00000000000000000000000000010101     25    21   15
00000000000000000000000000010110     26    22   16
00000000000000000000000000010111     27    23   17
(。。。略)

整数を8進で出力するには

変換指定は%o

整数を16進で出力するためには

小文字で出力したい時は、変換指定を%xにする。
大文字で出力したい時は、変換指定を%Xにする。