使用位运算符执行此操作

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 个。

以上是关于使用位运算符执行此操作的主要内容,如果未能解决你的问题,请参考以下文章

大位向量的按位运算

在 C++ 中对布尔值使用位运算符

如果一个为高电平,则将所有位设置为高字节

二进制位运算

按位运算符简单地翻转整数中的所有位?

位运算应用:保存多状态标识应用