C言語で、ビット演算を使い絶対値を返す関数について調べていた所ネットで以下の様に作成できることがわかりました。

int myabs(int b) {
    return (b ^ (b >> 31)) - (b >> 31);
}

確かに実際に↑の関数を書いたコードで試してみると絶対値が求められるのですが仕組みがどうも分かりません。

例えば b0x00000001 の場合,

(b >> 31) = 0x00000000,
(b ^ (b >> 31)) = 0xFFFFFFFE,
(b ^ (b >> 31)) - (b >> 31) = 0xFFFFFFFE となりませんか?