我正在阅读此答案,并提到此代码;
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];
清楚地添加data[c]
到sum
当且仅当data[c]
大于或等于 128。很容易证明
int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
是等价的(当data
只有正值时,它确实如此):
data[c] - 128
当且仅当data[c]
大于或等于 128 时为正。算术右移 31,它变为全 1(如果它小于 128)或全零(如果它大于或等于 128)。
然后,第二行在 that 的情况下添加到(so 0) 或在 that 的情况下sum
添加到(so ) 。0 & data[c]
data[c] < 128
0xFFFFFFFF & data[c]
data[c]
data[c] >= 128
int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
(请注意,这个 hack 并不严格等同于原始 if 语句。但在这种情况下,它对 data[] 的所有输入值都有效。)
(data[c] - 128) >> 31;
//当data[c]大于或等于128时,尝试仅提取data[c]的符号位,如果小于128,则(data[c] - 128)将自动转换为负数number 从而设置符号位。
并将sum += ~t & data[c];
值 data[c] 与 1 或 0 取决于符号位的补码。表示sum
如果 value( (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