Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解决(A&;N)和#x2B;(B&;N)和#x2B;(C&N)_C_Bit Manipulation - Fatal编程技术网

解决(A&;N)和#x2B;(B&;N)和#x2B;(C&N)

解决(A&;N)和#x2B;(B&;N)和#x2B;(C&N),c,bit-manipulation,C,Bit Manipulation,解决问题的有效方法是什么 (A&N)+(B&N)+(C&N)等等。 其中,&表示按位AND运算。 和A,B,C,N都是正整数。 是否有可能减少计算量。如果您正在组合位掩码,那么您可以使用:(A&N)|(B&N)|……在这种情况下,使用(A | B | C |……)和N做得更好 N.B.如果N=0x0020和A=0x003f,B=0x0a25,则: (A & N) + (B & N) = 0x0040 但是 这是组合位字段时更经常需要的。不,它不起作用。您总是有这样的危险,即在

解决问题的有效方法是什么
(A&N)+(B&N)+(C&N)
等等。 其中,
&
表示按位AND运算。 和
A
B
C
N
都是正整数。
是否有可能减少计算量。

如果您正在组合位掩码,那么您可以使用:
(A&N)|(B&N)|……
在这种情况下,使用(A | B | C |……)和N做得更好

N.B.如果
N=0x0020
A=0x003f
B=0x0a25
,则:

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


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

不,它不起作用。您总是有这样的危险,即在隐藏区域中添加的内容会弄乱您的数据

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

在这里,添加将为您带来

  0b0011111
+ 0b0101111
-----------
  0b1001110
& 0b0100000
-----------
  0b0000000
===========
在这里,添加较低的5 bis对位5有影响

如果在添加之前执行
&N
,则不会产生此类影响:

  0b0000000
+ 0b0100000
-----------
  0b0100000
===========

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

不是在这里宣传我自己的东西,但可以解决这样的问题。例如,如果您输入

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

换句话说,找到使其适用于所有
a
b
n

结果只有两个-1和0。这对那些人来说是有意义的:如果
n=-1
,那么根本就没有掩蔽,如果
n=0
,很明显,无论哪种方式,结果都是零


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

我认为没有办法。但我非常怀疑额外的
&
在任何实际情况下都会产生不可忽略的影响。可能会对特定的N值进行优化(例如,对于N=0,答案总是0;如果N的最低有效位都是1位,比a、B、C中的最大值多,那么答案就是a+B+C)。但是对于N的一般值,没有一条捷径可以做到。@ugoren上面提到的问题是一个大问题的子集,其中和运算必须进行10^6*10^6次..因此时间很重要。@MahavirChopra,如果你做一些简单的事情10^12次,从内存中获取所有这些数据很可能是你最糟糕的问题。你可以试着省略
&
(并得到错误的结果),只是为了看看它是否有区别。这取决于他是否担心进位-因此是限定符-这样做的最常见原因是组合过滤位掩码,原始代码将因进位而失败,有时候,史蒂夫,我不是在做加法运算,而是在做加法运算,但是似乎没有简单的方法。你为什么需要&运算?这是一个c代码,我被要求对数组的所有值进行成对的
运算。结果是不能减少,我必须进行长时间的计算,对吗?你的计算忽略了其他情况:其中N是2-1的任意幂,&变为mod N+1,模式可以移到外面。@LeeDanielCrocker我最初认为是这样,这就是我测试它的原因。但事实并非如此:例如,考虑A、B和N都是3的情况。
solve[n] (a & n) + (b & n) == (a + b) & n