ビット単位の入れ替え方
Posted: 2012年9月22日(土) 10:09
指定したビット同士を入れ替えをしてみたいです
&とか~とか^とか|とか>>を使って簡単に入れ替えできる式はないでしょうか?
コンパイラーはVC++2010EEです
&とか~とか^とか|とか>>を使って簡単に入れ替えできる式はないでしょうか?
コンパイラーはVC++2010EEです
言葉にするとbeatle さんが書きました:プログラムを考えなくて良いので,言葉でビット入れ替えのやり方を説明してみてください.
unsigned char bitCange( unsigned char a, unsigned char bit1, unsigned char bit2 ){
unsigned char keep = a; // コピーする
a&=~(1<<bit2); // bit2のビットを0にする
a|= ( a&(1<<bit1) )>>(bit1-bit2); // bit1とaの積を右にシフトしたものをaとの和をaに入れる
a&=~(1<<bit1); // bit1のビットを0にする
a|= ( keep&(1<<bit2) )<<(bit1-bit2); // bit2とkeepの積を左にシフトしたものをaとの和をaに入れる
return date;
}本当ですか?きみどり さんが書きました:いろいろ試していたらできました
0になってました確かに入れ替えできてませんかずま さんが書きました:本当ですか?bitCange(0x08, 1, 3) はいくつになりますか?
すみません書き間違いましたみけCAT さんが書きました:変数dateはどこから出てきたのですか?
unsigned char bitCange( unsigned char a, unsigned char bit1, unsigned char bit2 ){
unsigned char keep;
// bit1がbit2より小さいなら入れ替える
if( bit1 < bit2 ){
keep = bit1;
bit1 = bit2;
bit2 = keep;
}
keep = a; // コピーする
a&=~(1<<bit2); // bit2のビットを0にする
a|= ( a&(1<<bit1) )>>(bit1-bit2); // bit1とaの積を右にシフトしたものをaとの和をaに入れる
a&=~(1<<bit1); // bit1のビットを0にする
a|= ( keep&(1<<bit2) )<<(bit1-bit2); // bit2とkeepの積を左にシフトしたものをaとの和をaに入れる
return a;
}きみどり さんが書きました:&とか~とか^とか|とか>>を使って簡単に入れ替えできる式はないでしょうか?
unsigned bitSwap(unsigned a, int b1, int b2)
{
return a & ~(1<<b1 | 1<<b2) | (a>>b1 & 1)<<b2 | (a>>b2 & 1)<<b1;
}
unsigned bitSwap(unsigned a, int b1, int b2)
{
unsigned c = (a>>b1 ^ a>>b2) & 1;
return (c<<b1 | c<<b2) ^ a;
}