変数の任意のビットを抜き出す方法

[戻る]
tetsuro 2003/10/20(月) 22:27:49
こんにちは。1つ質問があるのでお願いします。

int a;
の任意のビットを抜き出したいのですが、何か簡潔な書き方は無いですか?
今まではビットのシフトを使って
(a >> n) % 2;
という風に書いていたのですが、ソースが読みにくくなってしまいます。

よろしくお願いします。

asdf 2003/10/20(月) 23:42:32
マクロは?

#define BIT(v, n) ( ((v) >> (n)) & 1 )

をよよ 2003/10/21(火) 00:04:04
std::bitset<>なんてのもあります。

#include <bitset>

bool bit( int a, int n )
{
    std::bitset< 8 * sizeof( int ) > b = a;
    return b[ n ];
}
// aの右からn番目(n=0,1,2, ..., 8*sizeof(int)-1 )のビットが
// 1ならtrue、0ならfalseを返す

# 簡潔とは言えないかな?

ひろぴー 2003/10/21(火) 09:17:18
単純に&演算子を使ってはダメなんでしょうか?
int a = xx1;
if ( a & xx2 )
{
    // ビットが立っていなかった場合
}

xx1,xx2は任意の数字

ひろぴー 2003/10/21(火) 09:19:11
↑任意の数字xx2は調べたいビットだけ立っている値です。
念の為(^^;)

をよよ 2003/10/21(火) 21:34:50
> 単純に&演算子を使ってはダメなんでしょうか?

そのアイディアをいただきました。

#include <cmath>
int bit( int a, int n )
{
    return  a & static_cast< int >( std::pow( 2, n ) ) ? 1 : 0;
}

をよよ 2003/10/21(火) 21:37:17
でも、やはりasdfさんの方法が最も簡潔かな。
マクロよりも関数にした方が読みやすそうではありますが。

kajiki [E-Mail] [HomePage] 2003/10/21(火) 21:46:23
わざわざ関数にする必要あるの?
& | ~ ^ ビット演算子を勉強したら?

PAI 2003/10/21(火) 23:10:32
こんなのは?

template< size_t I>
struct mask{
    enum{
        MASK = (mask<I-1>::MASK << 1)
    };
};

template<>
struct mask<1>{ enum{ MASK = 1 }; };

template <size_t I>
bool bit( int source ){
    return (source & mask<I>::MASK) != 0;
}

こうやって使う。
{
    int a = 0x80;

    if( bit<7>(a)){
        // 第8bitが立っている。
    }
}

通りすがり 2003/10/22(水) 04:19:44
> PAI 2003/10/21(火) 23:10:32
>    :
> template<>
> struct mask<1>{ enum{ MASK = 1 }; };
template<>
struct mask<0>{ enum{ MASK = 1 }; };
           ^^^
ではないかな?
それとも
> // 第8bitが立っている。
// 第7bitが立っている。

PAI 2003/10/22(水) 09:46:40
ほんとだ。ちゃんとテストすべきですな。

tetsuro 2003/10/22(水) 22:21:15
[[解決]]
色々な方法があって勉強になりました。
asdfさんの書かれた方法で関数を作る事にします。
皆さん回答ありがとうございました。

古いスレッドには追加発言できません。