f99aq8ove's blog

[C++] template で2進数表記(改)

tag: C++ and Programming
14 October 2007

このエントリは 2007-10-14 に書かれました。 内容が古くなっていたり、もはや正しくないこともありますので、十分検証を行ってください。

2進数表記がはやってるみたいですね。

そこで、テンプレート版を頭に0付けても大丈夫なようにしてみました。ただ、マクロにするとネームスペースからはみ出ちゃうのがちょっとなぁ。

#include <boost/config.hpp>

namespace util {
template <unsigned char x>
struct binary_number_check {
    typedef binary_number_check<x> self;
    typedef typename self::invalid_binary_number error;
};

template <> struct binary_number_check<0> {};
template <> struct binary_number_check<1> {};

template <unsigned long b>
struct binary_number : binary_number_check<b % 8> {
    BOOST_STATIC_CONSTANT(int, value = (binary_number<b / 8>::value << 1) + (b % 8));
};

template <>
struct binary_number<0> {
    BOOST_STATIC_CONSTANT(int, value = 0);
};

#define B(b) binary_number<0 ## b>::value
}

こんなふうにして使います。

#include <boost/static_assert.hpp>

#include "util/binary.hpp"

int main(void) {
    BOOST_STATIC_ASSERT(util::B(0) == 0);
    BOOST_STATIC_ASSERT(util::B(00) == 0);
    BOOST_STATIC_ASSERT(util::B(1) == 1);
    BOOST_STATIC_ASSERT(util::B(10) == 2);
    BOOST_STATIC_ASSERT(util::B(010) == 2);
    BOOST_STATIC_ASSERT(util::B(00000100) == 4);
    BOOST_STATIC_ASSERT(util::B(00001000) == 8);
    BOOST_STATIC_ASSERT(util::B(00010000) == 16);
    BOOST_STATIC_ASSERT(util::B(00100000) == 32);
    BOOST_STATIC_ASSERT(util::B(01000000) == 64);
    BOOST_STATIC_ASSERT(util::B(10000000) == 128);
    BOOST_STATIC_ASSERT(util::B(11111111) == 255);

    return 0;
}

Related Posts