如果 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)
如果 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)
是的,输入的范围使它稍微容易一些。
您可以使用(x - 1) >> 31
来检测是否x
为 0(技术上不可移植,但通常可以使用)
它依赖于x
永远不会小于 0,并且不可移植地依赖于有符号 int 上的右移是算术移位(通常是这种情况)。
同样,您可以使用((x ^ 224) - 1) >> 31
224 来检测。
像这样把它们放在一起:
int mask = ((x - 1) >> 31) | (((x ^ 224) - 1) >> 31);
你去吧。
abs(2x-A) == A
我想到了(其中 A 是您的常数 224),但abs()
很可能在内部进行比较,减法几乎不是一点操作。你到底想做什么,是为了速度还是只是为了好奇?
另一个想法是模数x%A == 0
,但这对于 A 的所有倍数也将返回 true。 (448,672,...)
if (!num^0x3F) {
// a little less readable
}