6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

特定のビットを指定のビットへコピーする

Last updated at Posted at 2016-10-17

最近C言語のプロジェクトを行うことになったのでリハビリも兼ねてビット演算を書いてみた。
同じ変数の特定ビットから指定したビットへコピーする関数。

追記:baseの内容も書き換えていたので修正。

ソース
unsigned char copyBit( unsigned char base, unsigned char x_bit, unsigned char y_bit )
{
	unsigned char ret = 0;

	/* ビットチェック(Xビット位置のビットが1か判定) */
	if( ( ( base >> ( x_bit - 1 ) ) & 1 ) )
	{
		/* Yビット位置のビットを1に設定 */
		ret = ( base | ( 1 << ( y_bit - 1 ) ) );
	}
	else
	{
		/* Yビット位置のビットを0に設定 */
		ret = ( base & ~ ( 1 << ( y_bit - 1 ) ) );
	}
	return ret;
}

第1引数に元となる変数を指定、第2引数にコピー元ビット位置、
第3引数にコピー先ビット位置を指定する。
ビット位置は1始まりで指定する(0ビット目という指定ではない)。

使い方
unsigned char bit = 0x01;
bit = copyBit( bit, 1, 5 );

copyBit()を使った時の例。

[例1] 1ビットから5ビットへコピーする
base = 0000 0001(2進数), x_bit = 1, y_bit = 5
返却 = 0001 0001(2進数)

[例2] 1ビットから5ビットへコピーする
base = 0001 0001(2進数), x_bit = 1, y_bit = 5
返却 = 0001 0001(2進数)

[例3] 1ビットから5ビットへコピーする
base = 0000 0000(2進数), x_bit = 1, y_bit = 5
返却 = 0000 0000(2進数)

[例4] 1ビットから5ビットへコピーする
base = 0001 0000(2進数), x_bit = 1, y_bit = 5
返却 = 0000 0000(2進数)

[例5] 8ビットから3ビットへコピーする
base = 1000 0000(2進数), x_bit = 8, y_bit = 3
返却 = 1000 0100(2進数)

[例6] 0ビットから4ビットへコピーする
<<禁止>>
base = 1111 1111(2進数), x_bit = 0, y_bit = 4
返却 = 1111 0111(2進数)

[例7] 9ビットから6ビットへコピーする
<<禁止>>
base = 1111 1111(2進数), x_bit = 9, y_bit = 6
返却 = 1101 1111(2進数)

6
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?