按位运算是否会分配?

时间:2009-11-10 22:41:18

标签: optimization hardware bit-manipulation fpga

我正在研究一种我正在尝试优化的算法,它基本上有点麻烦,其次是在一个紧凑的反馈中添加了一些内容。如果我可以为加法器使用进位保存添加,它确实可以帮助我加快速度,但我不确定是否可以通过添加来分配操作。

特别是如果我代表:

  a = sa+ca  (state + carry)
  b = sb+cb

我可以用s和c来表示(>>> r)吗? 一个|怎么样? b和a& B'

2 个答案:

答案 0 :(得分:7)

考虑一下......

sa = 1    ca = 1
sb = 1    cb = 1
a = sa + ca = 2
b = sb + cb = 2
(a | b) = 2
(a & b) = 2
(sa | sb) + (ca | cb) = (1 | 1) + (1 | 1) = 1 + 1 = 2 # Coincidence?
(sa & sb) + (ca & cb) = (1 & 1) + (1 & 1) = 1 + 1 = 2 # Coincidence?

让我们尝试一些其他值:

sa = 1001   ca = 1   # Binary
sb = 0100   cb = 1
a = sa + ca = 1010
b = sb + cb = 0101
(a | b) = 1111
(a & b) = 0000
(sa | sb) + (ca | cb) = (1001 | 0101) + (1 | 1) = 1101 + 1 = 1110 # Oh dear!
(sa & sb) + (ca & cb) = (1001 & 0101) + (1 & 1) = 0001 + 1 = 2    # Oh dear!

因此,通过4位计数器示例证明您不能通过添加来分配AND或OR。

'>>>'怎么样? (无符号或逻辑右移)。使用最后一个示例值,并且r = 1:

sa = 1001
ca = 0001
sa >>> 1 = 0101
ca >>> 1 = 0000
(sa >>> 1) + (ca >>> 1) = 0101 + 0000 = 0101
(sa + ca) >>> 1 = (1001 + 0001) >>> 1 = 1010 >>> 1 = 0101  # Coincidence?

让我们看看这是否也是巧合:

sa = 1011
ca = 0001
sa >>> 1 = 0101
ca >>> 1 = 0000
(sa >>> 1) + (ca >>> 1) = 0101 + 0000 = 0101
(sa + ca) >>> 1 = (1011 + 0001) >>> 1 = 1100 >>> 1 = 0110  # Oh dear!

再次以反例证明。

因此逻辑右移也不是对加法的分配。

答案 1 :(得分:1)

不,您不能在二元运算符上分配AND或OR。

<强>解释

设P是P :( A + B)&amp; C = A&amp; C + B&amp; C

的命题

让我们取A = 2,B = 3 =&gt; A + B = 5.

我们要证明A&amp; C + B&amp; C!=(A + B)&amp; C

A = 2 = 010

B = 3 = 011

让010&amp; C = x, 其中x是某个整数,其值是按位AND的结果010和C

类似于011&amp; C = y,其中y是某个整数,其值是按位AND的结果,011和C

因为我们不能说P对自然数集合中的所有C({0,1,...})成立,所以P为假。

在这种情况下,取C = 2 = 010

x = 010&amp; 010 = 010 = 2

y = 011&amp; 010 = 010 = 2

5&amp; 2 = 101&amp; 010 = 000 = 0

显然,x + y!= 0,这意味着(A + B)&amp; C!= A&amp; C + B&amp; C.

因此证明了!