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] < 128或0xFFFFFFFF & data[c](所以data[c]在的情况下)data[c] >= 128.