假设我正在寻找具有某些值的按位函数,例如 -
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?),但我不知道这里有多少障碍。
任何答案都会引起极大兴趣:)
和平
取值
答案 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会消失,并且两个补充相互平衡)。