質問: `0xFFFFFFFE` となりませんか?
回答: b が 0x00000001 の場合、 ``` (b ^ (b >> 31)) = 0x00000001 ``` ですね。 以下、`myabs()` の説明です。 絶対値を求めるなら、 * 元の数値が 0以上ならそのまま * 元の数値が負数なら符号を反転 とすれば良いわけです。ここに、2の補数の * 全てのビットを反転して +1 すると値の符号が反転する。 * 最上位ビットは符号である。 という特徴を活かします。 `b >> 31` は、最上位ビットで他の31ビットを塗りつぶします。 つまり、 * `b` が 0 以上なら 0 * `b` が負数なら -1 (全てのビットが 1) となります。 従って `(b ^ (b >> 31))` は * `b` が 0 以上なら何も起きない (`b >> 31` が 0 だから) * `b` が負数なら `b` のビットが全て反転する (`b >> 31` は全てのビットが 1 だから) ということになります。 また `- (b >> 31)` の部分ですが、これは * `b` が 0 以上なら 0 (`b >> 31` が 0 だから) * `b` が負数なら +1 (`b >> 31` が -1 だから) となります。 以上の処理により、 * `b` が 0 以上なら何もせず `b` のまま * `b` が負数ならビットを反転して +1 する (つまり符号を反転する) という処理が実現できていることになり、絶対値が求まります。