24

私はこの答えを読んでいて、このコードが言及されています。

if (data[c] >= 128)
    sum += data[c];

これと交換できます。

int t = (data[c] - 128) >> 31;
sum += ~t & data[c];

私はこれを理解するのに苦労しています。誰かがビット演算子がどのようにifステートメントを達成するかを説明できますか?

4

3 に答える 3

30
if (data[c] >= 128)
    sum += data[c];

128以上の場合にのみ、明らかに追加data[c]されます。それを示すのは簡単です。sumdata[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] < 1280xFFFFFFFF & data[c]data[c]data[c] >= 128

于 2012-08-19T12:16:15.703 に答える
4

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))が負の場合、何も追加されないことを意味します。

于 2012-08-19T11:36:03.590 に答える
0
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
于 2015-12-26T09:20:04.073 に答える