构造满足约束/具有某些值的按位表达式的一般方法?

时间:2013-09-18 10:46:03

标签: bit-manipulation bitwise-operators bit bit-shift

假设我正在寻找具有某些值的按位函数,例如 -

f(0b00,0b00)!=0         
f(0b00,0b10)==0     
f(0b10,0b10)!=0     
f(0b11,0b10)!=0     
f(0b01,0b10)==0

是否有一种为这类系统构建单个按位表达式f的通用方法? (我不确定,但是如果你有一个巨大的表达式一次掩盖掉一点,那么可能会有一些糟糕的解决方案,所以让我们说这些表达式必须适用于所有大小的整数)

我能够做到的最好的转换是

f(int a, int b) 
{
    if (a==0    ) {
        return b==0;
    } else {
        return (a&b)!=0;
    }
}

我怀疑将(x == 0)条件与(x!= 0)条件组合是很困难的(给定x,是否存在按位函数f,使得x == 0< => f( x)!= 0?),但我不知道这里有多少障碍。

任何答案都会引起极大兴趣:)

和平

取值

1 个答案:

答案 0 :(得分:1)

最常见的结构是“minterms”的扩展版本。使用按位运算符构造谓词,如果输入与特定事物匹配则为-1,并且谓词包含您想要的结果,然后将所有这些事物组合在一起。这导致了可怕的表达,可能是指数大小。

使用算术右移,您可以构造谓词p(x, c) = x == c

p(x, c) = ~(((x ^ c) >> 31) | (-(x ^ c) >> 31))

用int减去1的大小替换31。

唯一的数字,它和它的否定都是非负的,是零。因此,如果x ^ c == 0,最终补语中的内容只为零,这与x == c的内容相同。

所以在这个例子中,您将拥有:

(p(a, 0x00) & p(b, 0x00)) |
(p(a, 0x10) & p(b, 0x10)) |
(p(a, 0x11) & p(b, 0x10))

将它扩展为可怕的东西。

显然,这种结构通常不会给你任何明智的东西。但这很普遍。

在具体示例中,您可以执行以下操作:

f(a, b) = (p(a, 0) & p(b, 0)) | ~p(a & b, 0)

可以再次简化一下(显然,如果c == 0,则xors会消失,并且两个补充相互平衡)。