使用位运算符执行此操作
Posted
技术标签:
【中文标题】使用位运算符执行此操作【英文标题】:Do this using bit operators 【发布时间】:2013-08-23 03:58:24 【问题描述】:如果 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)
【问题讨论】:
向我们展示您的尝试。 为什么?它已经在使用快速操作,更重要的是它是可读的 比特旋转黑客的标准去处是Bit Twiddling Hacks。不过,我不确定它是否涵盖这样的情况。 我发布了我的一个尝试。 我原谅指定 num 始终在 0 到 255 之间 【参考方案1】:是的,输入的范围稍微容易一些。
您可以使用(x - 1) >> 31
来检测x
是否为0(技术上不可移植,但通常可以工作)
它依赖于x
永远不会小于 0,并且不可移植地依赖于有符号整数的右移是算术移位(通常是这种情况)。
同样,您可以使用((x ^ 224) - 1) >> 31
来检测224。
像这样把它们放在一起:
int mask = ((x - 1) >> 31) | (((x ^ 224) - 1) >> 31);
你去吧。
【讨论】:
【参考方案2】:abs(2x-A) == A
浮现在脑海中(其中 A 是您的常数 224),但 abs()
可能会在内部进行比较,而减法几乎不是一点操作。你到底想做什么,是为了速度还是只是为了好奇?
另一个想法是模数x%A == 0
,但这对于 A 的所有倍数也将返回 true。(448,672,...)
【讨论】:
感谢您的回复。是为了好奇尝试找到更快的方法。 对不起,我不明白,什么是 A ? 2x 表示 2 * ? 顺便说一句,你也可以在几个位运算中做abs
A 是 224,你的常数。您的问题是针对数字 224 的吗?我将这个问题作为一个通用常量来处理......【参考方案3】:
if (!num^0x3F)
// a little less readable
【讨论】:
这对我不起作用。这个程序:#include <stdio.h> int main(void) for (int num = 0; num < 256; num++) if (!num^0x3F) printf("%d\n", num); return(0);
列出所有 256 个数字 0..255。如果表达式写成 if (!(num^0x3F))
,它只列出 63 个。以上是关于使用位运算符执行此操作的主要内容,如果未能解决你的问题,请参考以下文章