私はこの答えを読んでいて、このコードが言及されています。
if (data[c] >= 128)
sum += data[c];
これと交換できます。
int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
私はこれを理解するのに苦労しています。誰かがビット演算子がどのようにifステートメントを達成するかを説明できますか?
私はこの答えを読んでいて、このコードが言及されています。
if (data[c] >= 128)
sum += data[c];
これと交換できます。
int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
私はこれを理解するのに苦労しています。誰かがビット演算子がどのようにifステートメントを達成するかを説明できますか?
if (data[c] >= 128)
sum += data[c];
128以上の場合にのみ、明らかに追加data[c]
されます。それを示すのは簡単です。sum
data[c]
int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
同等です(data
正の値のみを保持している場合):
data[c] - 128
は、128以上の場合にのみ正ですdata[c]
。算術的に右に31シフトすると、すべて1(128より小さい場合)またはすべて0(128以上の場合)になります。
次に、2行目は、その場合は(so zero)に、その場合は(so )に追加されsum
ます。0 & data[c]
data[c] < 128
0xFFFFFFFF & data[c]
data[c]
data[c] >= 128
int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
(このハックは、元のifステートメントと厳密に同等ではないことに注意してください。ただし、この場合、data []のすべての入力値に対して有効です。)
(data[c] - 128) >> 31;
//これは、data [c]が128以上の場合、data [c]の符号ビットのみを抽出しようとします。128未満の場合、(data [c]-128)は自動的に負の値にシフトします。したがって、符号ビットを設定する数値。
そしてsum += ~t & data[c];
、符号ビットの補完された値に応じて、値data [c]を1または0のいずれかとANDします。value sum
((data[c] - 128)
)が負の場合、何も追加されないことを意味します。
if (data[c] >= 128)
sum += data[c];
に等しい
if (data[c] - 128 >= 0)
sum += data[c];
これは、負でないdata[c]
場合は合計に加算することを意味します。data[c] - 128
したがって、の符号を抽出する必要がありdata[c] - 128
ます。データは32ビットint配列であるため。したがって、符号を取得するには、算術的に時間をシフトする必要があり32 - 1 = 31
ます。それで
int t = (data[c] - 128) >> 31; //where t is the sign of data[c] - 128, 0 for positive and 1 for negative
sum += ~t & data[c]; //Add data[c] in sum if t = 0 i.e when the sign of data[c] - 128 is positive