0

如果 0 到 255 之间的整数等于 0 或等于 224,我想要 eval。

我有这个代码:

if (!num || 224 == num)

有没有办法使用一些按位运算来做到这一点?

我试过了,我有:0、31、32、63、64、95、96、127、128、159、160、191、192、223、224、255。显然很糟糕,因为我只需要 0 和 224 .

!((num+1) & 30)
4

3 回答 3

1

是的,输入的范围使它稍微容易一些。

您可以使用(x - 1) >> 31来检测是否x为 0(技术上不可移植,但通常可以使用)

它依赖于x永远不会小于 0,并且不可移植地依赖于有符号 int 上的右移是算术移位(通常是这种情况)。

同样,您可以使用((x ^ 224) - 1) >> 31224 来检测。

像这样把它们放在一起:

int mask = ((x - 1) >> 31) | (((x ^ 224) - 1) >> 31);

你去吧。

于 2013-08-23T07:59:48.030 回答
0

abs(2x-A) == A我想到了(其中 A 是您的常数 224),但abs()很可能在内部进行比较,减法几乎不是一点操作。你到底想做什么,是为了速度还是只是为了好奇?

另一个想法是模数x%A == 0,但这对于 A 的所有倍数也将返回 true。 (448,672,...)

于 2013-08-23T05:32:10.903 回答
-2
if (!num^0x3F) {
  // a little less readable
}
于 2013-08-23T04:18:38.657 回答