最近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進数)