ビットマスク

最近,上位(下位) N ビットマスクが必要となる事が多く,その都度考えるのが面倒になってきたのでビットマスク用のテンプレートを作成します.作成すると言うほどのものでもありませんが.

template <
    int LowerBits,
    class Type = unsigned long
>
struct bitmask {
    static const Type full = ~(Type(0));
    static const Type upper = ~((Type(1) << LowerBits) - 1);
    static const Type lower = (Type(1) << LowerBits) - 1;
};

テンプレートパラメータに上位/下位の境界となる位置のビット数を下から数えた値(下位 N ビット)で指定します.その後は,上位のビットマスクが欲しければ bitmask::upper,下位のビットマスクが欲しければ bitmask::lower のように使います.

#include <iostream>
#include <iomanip>
#include "clx/utility.h"

int main(int argc, char* argv[]) {
    std::cout << std::hex << std::showbase;
    
    std::cout << "2 bit mask:" << std::endl;
    std::cout << clx::bitmask<2>::upper << std::endl;
    std::cout << clx::bitmask<2>::lower << std::endl;
    std::cout << std::endl;
    std::cout << "10 bit mask:" << std::endl;
    std::cout << clx::bitmask<10>::upper << std::endl;
    std::cout << clx::bitmask<10>::lower << std::endl;
    std::cout << std::endl;
    std::cout << "15 bit mask:" << std::endl;
    std::cout << clx::bitmask<15>::upper << std::endl;
    std::cout << clx::bitmask<15>::lower << std::endl;
    std::cout << std::endl;
    std::cout << "16 bit mask:" << std::endl;
    std::cout << clx::bitmask<16>::upper << std::endl;
    std::cout << clx::bitmask<16>::lower << std::endl;
    std::cout << std::endl;
    std::cout << "31 bit mask:" << std::endl;
    std::cout << clx::bitmask<31>::upper << std::endl;
    std::cout << clx::bitmask<31>::lower << std::endl;
    
    return 0;
}
実行結果
$ ./a
2 bit mask:
0xfffffffc
0x3

10 bit mask:
0xfffffc00
0x3ff

15 bit mask:
0xffff8000
0x7fff

16 bit mask:
0xffff0000
0xffff

31 bit mask:
0x80000000
0x7fffffff