こんにちは。1つ質問があるのでお願いします。
int a;
の任意のビットを抜き出したいのですが、何か簡潔な書き方は無いですか?
今まではビットのシフトを使って
(a >> n) % 2;
という風に書いていたのですが、ソースが読みにくくなってしまいます。
よろしくお願いします。
マクロは?
#define BIT(v, n) ( ((v) >> (n)) & 1 )
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を返す
# 簡潔とは言えないかな?
単純に&演算子を使ってはダメなんでしょうか?
int a = xx1;
if ( a & xx2 )
{
// ビットが立っていなかった場合
}
xx1,xx2は任意の数字
↑任意の数字xx2は調べたいビットだけ立っている値です。
念の為(^^;)
> 単純に&演算子を使ってはダメなんでしょうか?
そのアイディアをいただきました。
#include <cmath>
int bit( int a, int n )
{
return a & static_cast< int >( std::pow( 2, n ) ) ? 1 : 0;
}
でも、やはりasdfさんの方法が最も簡潔かな。
マクロよりも関数にした方が読みやすそうではありますが。
わざわざ関数にする必要あるの?
& | ~ ^ ビット演算子を勉強したら?
こんなのは?
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が立っている。
}
}
> PAI 2003/10/21(火) 23:10:32
> :
> template<>
> struct mask<1>{ enum{ MASK = 1 }; };
template<>
struct mask<0>{ enum{ MASK = 1 }; };
^^^
ではないかな?
それとも
> // 第8bitが立っている。
// 第7bitが立っている。
ほんとだ。ちゃんとテストすべきですな。
色々な方法があって勉強になりました。
asdfさんの書かれた方法で関数を作る事にします。
皆さん回答ありがとうございました。