C言語でビット演算を利用して絶対値を返す関数の仕組みが理解できない
C言語で、ビット演算を使い絶対値を返す関数について調べていた所ネットで以下の様に作成できることがわかりました。
int myabs(int b) {
return (b ^ (b >> 31)) - (b >> 31);
}
確かに実際に↑の関数を書いたコードで試してみると絶対値が求められるのですが仕組みがどうも分かりません。
例えば b
が 0x00000001
の場合,
(b >> 31)
= 0x00000000
,
(b ^ (b >> 31))
= 0xFFFFFFFE
,
(b ^ (b >> 31)) - (b >> 31)
= 0xFFFFFFFE
となりませんか?