C言語,ビット位置とビット数を指定し、右詰めで取得する

スポンサーリンク

鍛錬 306

C言語,ビット位置とビット数を指定し、右詰めで取得する

ビット演算で、指定したビット位置から指定したビット数を右詰めで取得する関数についてです。

スポンサーリンク

プログラム

以下は、指定したビット位置から指定したビット数を右詰めで取得するプログラム、getbits.c です。

(※ 右端をビット位置 0 とします。)

// include
#include <stdio.h>

// prototype
unsigned int getbits(unsigned int x, int p, int n);

// main
int main(void)
{
	unsigned int x;
	int p;
	int n;
	unsigned int ret;
	
	// 初期化
	x = 123;  // ビット列
	p = 6;    // 取得開始ビット位置
	n = 3;    // 取得ビット数
	
	ret = getbits(x, p, n);
	printf("%d\n", ret);
	
	return 0;
}

// =======================================================
// @brief     x について、p から n ビット右詰めで取得する
// @param[in] x  取得対象
// @param[in] p  取得開始ビット位置
// @param[in] n  取得ビット数
// @return    result -> 取得ビット(右詰め)
// @note      無し
// =======================================================
unsigned int getbits(unsigned int x, int p, int n)
{
	unsigned int result;
	
	result = (x >> (p + 1 - n)) & ~(~0 << n);
	
	return result;
}
スポンサーリンク

実行結果の予測

パラメータ

上記に示した getbits.c は、各パラメータを以下の通りに設定しています。

unsigned int ret;

// 初期化
x = 123;  // ビット列
p = 6;    // 取得開始ビット位置
n = 3;    // 取得ビット数

ret = getbits(x, p, n);
printf("%d\n", ret);
項目 値 (10進数) 値 (2進数)
x:取得対象 123 0111 1011
p:取得開始ビット位置 6
n:取得ビット数 3

(※ 右端をビット位置 0 とします。)

ビット演算にてパラメータを処理

前述した各パラメータを、関数 getbits のビット演算にて処理すると、以下に示す結果となるはずです。

getbits.c から抜粋

{
	unsigned int result;
	
	result = (x >> (p + 1 - n)) & ~(~0 << n);
	
	return result;
}

 
ビット演算の処理内容

result = (x >> (p + 1 - n)) & ~(~0 << n)
result = (0111 1011 >> (6 + 1 - 3)) & ~(1111 1111 << 3)
result = (0111 1011 >> 4) & ~(1111 1000)
result = (0000 0111) & (0000 0111)
result = (0000 0111)

結果予測

以上の結果より、プログラムを実行すると以下の値を取得できるはずです。

n進数 取得値
2進数 0000 0111
10進数 7

 
上記の予測される結果は、以下に示す通り、「指定したビット位置から指定したビット数を右詰めで取得する」ことができています。

入出力
入力 0111 1011
出力 0000 0111
スポンサーリンク

実行結果

以下は、プログラム getbits.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall getbits.c -o getbits
***@ubuntu:~/***/test/c$ ./getbits
7

 
上記に示した通り、予測通り10進数の 7 (2進数 の場合は 0000 0111) を取得することができました。

タイトルとURLをコピーしました