整数 n とそのマスク k (1 バイト: 負の数の場合は 1111 1111 、正の数の場合は 0000 0000 ) が与えられた通常の整数 (ビット演算) のようです。
(n ^ K) - K = (n + K) ^ K
これは、K をマスクとして数値 n の絶対値を計算するためによく使用されます。私の質問は、なぜ上記の式が機能するのですか? これら 2 つの用語が等しいのはなぜですか?
整数 n とそのマスク k (1 バイト: 負の数の場合は 1111 1111 、正の数の場合は 0000 0000 ) が与えられた通常の整数 (ビット演算) のようです。
(n ^ K) - K = (n + K) ^ K
これは、K をマスクとして数値 n の絶対値を計算するためによく使用されます。私の質問は、なぜ上記の式が機能するのですか? これら 2 つの用語が等しいのはなぜですか?
k の 2 つの値 (0 と -1) だけに関心があるようです。
k=0 の場合: (n^0)-0=(n+0)^0
、わかりました。
k=-1 の場合、 であるためn^-1==~n
、これは と書き換えます~n+1=~(n-1)
。両側に n-1 を追加してみて、n+~n==-1 であることに注意してください。
そうではないと思います。為に
(n ^ k) - k = (n + k) ^ k =>
((n ^ k) - k) ^ k) = (n + k) ^ k ^k =>
(n ^ k) ^ k - k ^ k = n + k => ### WRONG
n ^ k - 0 = n + k =>
n ^ k = n + k =>
n & k = 0
それが方程式の前提条件です。
編集
xor は減算で分配的でないという間違いを犯しました。(a - b) ^ c = a ^ c - b ^ c
間違っている!
と の整数オーバーフローがk = ~0
ありn + k
ます。したがって、未定義の動作につながります。