if-statement和bitwise操作在这个例子中是如何相同的?

yas*_*sar 23 c if-statement bit-manipulation

我正在读这个答案,并提到这个代码;

if (data[c] >= 128)
    sum += data[c];
Run Code Online (Sandbox Code Playgroud)

可以用这个替换;

int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
Run Code Online (Sandbox Code Playgroud)

我很难理解这一点.有人可以解释按位运算符如何实现if语句的作用吗?

har*_*old 27

if (data[c] >= 128)
    sum += data[c];
Run Code Online (Sandbox Code Playgroud)

显然,增加了data[c]sum当且仅当data[c]是大于128或等于这很容易证明

int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
Run Code Online (Sandbox Code Playgroud)

是等价的(当data只保持正值时,它会这样做):

data[c] - 128当且仅当data[c]大于或等于128时才是正数.算术右移31,它变为全1(如果小于128)或全零(如果它大于或等于128).

然后,第二行增加sum或者0 & data[c](所以零)的情况下data[c] < 1280xFFFFFFFF & data[c](所以data[c]在的情况下)data[c] >= 128.