1

什么将是有效的解决方法 (A & N) + (B & N) + (C & N) ..等等。其中&代表按位与运算。和A, B, C,N都是正整数。是否可以减少计算量。

4

3 回答 3

1

不,这行不通。您总是有危险,在屏蔽区域中添加会弄乱您的数据。

例如,如果N = 0x0020, A = 0x001f, B=0x002fN = 0b0100000, A = 0b0011111, B = 0b0101111

这里的加法会给你带来

  0b0011111
+ 0b0101111
-----------
  0b1001110
& 0b0100000
-----------
  0b0000000
===========

在这里,添加低 5 bis 对第 5 位有影响。

如果您在& N添加之前执行此操作,则不会产生这样的影响:

  0b0000000
+ 0b0100000
-----------
  0b0100000
===========
于 2013-08-25T09:33:14.897 回答
1

如果你正在组合位掩码,那么你可能会得到你需要的东西:(A & N) | (B & N) |... 在这种情况下,你会用 (A|B|C|...) & N 做得更好。

注意如果N = 0x0020A = 0x003fB=0x0a25那么:

(A & N) + (B & N) = 0x0040 

(A|B)&N = 0x0020

这通常是组合位字段时需要的。

于 2013-08-25T07:17:24.760 回答
0

如其他答案所示,这通常不起作用。事实上,它通常不会。

不是在这里宣传我自己的东西,但是这个网站可以解决这样的事情。例如,如果您输入

solve[n] (a & n) + (b & n) == (a + b) & n

这意味着“求解 n 使得对于每个 a, b, (a & n) + (b & n) == (a + b) & n

换句话说,找到n使它适用于所有a's 和b's 的东西。

结果只有两个。-1 和 0。它适用于以下情况是有道理的:如果n = -1,则根本没有掩蔽,如果n = 0,显然结果为零。

但它不适用于其他任何东西,除非你对a's 和b's 有一些具体的保证。

于 2013-08-25T09:59:25.917 回答