Если data[c] >= 128
, то data[c] - 128
будет неотрицательным, поэтому бит знака будет 0
. В противном случае, если data[c] < 128
, то data[c] - 128
будет отрицательным, поэтому его бит знака будет 1
.
Если мы сдвинемся вправо на 31 (при условии, что int
составляет 32 бита, а сдвиг вправо являются arithmeti c, так что да, реализация определена, но довольно распространена), тогда у нас будет либо 0x00000000
, когда data[c] >= 128
, либо 0xffffffff
, когда data[c] < 128
.
Если мы затем поразрядно инвертируем это значение, тогда у нас будет либо 0xffffffff
, когда data[c] >= 128
, либо 0x00000000
, когда data[c] < 128
.
Если мы поразрядно И это значение с data[c]
, тогда у нас будет либо data[c]
, когда data[c] >= 128
или 0x00000000
, если data[c] < 128
.
Добавление 0
к sum
ничего не делает, поэтому мы фактически добавляем только значения, которые больше или равны 128
без ветвления.