変数の任意のビットを抜き出す方法 – プログラミング – Home

変数の任意のビットを抜き出す方法
 
通知
すべてクリア

[解決済] 変数の任意のビットを抜き出す方法


tetsuro
 tetsuro
(@tetsuro)
ゲスト
結合: 22年前
投稿: 2
Topic starter  

こんにちは。1つ質問があるのでお願いします。

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

よろしくお願いします。


引用未解決
トピックタグ
asdf
 asdf
(@asdf)
ゲスト
結合: 22年前
投稿: 1
 

マクロは?

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


返信引用
をよよ
 をよよ
(@をよよ)
ゲスト
結合: 22年前
投稿: 15
 

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を返す

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


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

単純に&演算子を使ってはダメなんでしょうか?
int a = xx1;
if ( a & xx2 )
{
// ビットが立っていなかった場合
}

xx1,xx2は任意の数字


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

↑任意の数字xx2は調べたいビットだけ立っている値です。
念の為(^^;)


返信引用
をよよ
 をよよ
(@をよよ)
ゲスト
結合: 22年前
投稿: 15
 

> 単純に&演算子を使ってはダメなんでしょうか?

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

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


返信引用
をよよ
 をよよ
(@をよよ)
ゲスト
結合: 22年前
投稿: 15
 

でも、やはりasdfさんの方法が最も簡潔かな。
マクロよりも関数にした方が読みやすそうではありますが。


返信引用
kajiki
 kajiki
(@kajiki)
ゲスト
結合: 22年前
投稿: 19
 

わざわざ関数にする必要あるの?
& | ~ ^ ビット演算子を勉強したら?


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

こんなのは?

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が立っている。
}
}


返信引用
通りすがり
 通りすがり
(@通りすがり)
ゲスト
結合: 25年前
投稿: 92
 

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


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

ほんとだ。ちゃんとテストすべきですな。


返信引用
tetsuro
 tetsuro
(@tetsuro)
ゲスト
結合: 22年前
投稿: 2
Topic starter  

色々な方法があって勉強になりました。
asdfさんの書かれた方法で関数を作る事にします。
皆さん回答ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました