两个整数的XOR是否超出范围?

我一直在研究在数组中寻找孤独整数的algorithm,这里是实现:

int arr[] = {10, 20, 30, 5, 20, 10, 30}; int LonelyInteger = 0; for(int i=0; i< 7; i++) { LonelyInteger = LonelyInteger ^ arr[i]; } 

结果是5

我的问题是 – 据说由于这个操作,整数(由XOR操作产生) 太大了

 LonelyInteger ^ arr[i] 

这导致一个潜在的大整数不能由数据types表示在这种情况下说int 。 我的问题是:

  1. XOR甚至有可能产生一个不能存储在inttypes中的大整数值?
  2. 如果这不可能发生,那么是否有证据呢?

XOR永远不会超出界限,因为它将比特组合在一起,并且不会在没有比特被设置之前创build新的比特。

结果5是正确的。 看看你的值和XOR结果的二进制表示

 10 00001010 20 00010100 30 00011110 5 00000101 20 00010100 10 00001010 30 00011110 -------------- 00000101 => 5 

计算许多XOR ed值结果的一个简单的帮助是:结果将有一个位组合的位数,其中奇数个位组合,没有位设置为偶数位。

如果这不可能发生,那么是否有证据呢?

XOR相当于不加进个别位的加法。 当你添加没有进位时,不会发生溢出,所以int值不能超出范围。

由于操作被定义为合并操作数的位值,不会产生任何新的位,因此结果永远不会“太大”,因为其表示需要比int提供更多的位。 也许更好的问题可能是,结果可以是除int的有效值表示之外的东西吗?

对于无符号整数,不。 所有位模式以及所有按位操作的结果都是有效的数值表示。

对于有符号整数,它依赖于实现定义的负值表示。 您可能遇到的每个实现都使用2的补码,其中每个位模式都是有效的; 所以再次,任何按位操作的结果将是一个有效的表示。

但是,该标准还允许其他表示,其中可能存在一个或多个无效位模式。 在这种情况下,使用两个有效操作数进行按位操作可能会产生该模式,从而产生无效结果。

(这篇文章适用于C,而不是C ++)

按位运算符不能由于设置无效填充位而导致陷阱表示,请参阅C11 6.2.6.2/1注脚:

…对有效值不进行算术运算可以生成陷阱表示…

(“算术运算”的含义不清楚,但索引与XOR的定义6.5.11相关)。

但是,在C中,它们可以导致产生负的零 。 在2的补码中没有负的零。 但是假设你在一个有1的补码的系统上,那么你可以通过^生成负的零,这可能会导致一个陷阱表示。 6.2.6.2/3明确表示这是可能的:

如果实现支持负零,则只能通过以下方式生成:

– 带有操作数的&,|,^,〜,<<和>>运算符,它们产生这样一个值;

最后6.2.6.2/2意味着(我确定无论如何)不可能有任何值的位组合,这些值将会代表一个超过INT_MAX的整数


总而言之,两个int的可能结果是:

  • 另一个有效的int值(可能与其他版本的相同值具有不同的但不包含的填充位)
  • 负零,这可能会或可能不会导致陷阱

严格来说,你不能XOR两个整数 。 您可以异或两个整数大小的位,并且可以在其他时间将这些位的位数视为整数。 你甚至可以在其他时候把它们看作整数。

但是在执行XOR操作的时刻,你将它们看作是完全不同于整数或偶数的东西 :它们只是两个比特序列,相应的比特被比较。 溢出的概念不适用于这个,所以如果你决定把结果当作一个整数来处理,它也不能溢出。

XOR甚至有可能产生一个不能存储在inttypes中的大整数值?

如果操作数是int ,那么不。

如果这不可能发生,那么是否有证据呢?

那么,这个定义是微不足道的。 这并不是math上严格的certificate,但是如果其中一个操作数在该位置有1,则可以认为XOR的输出中只有一位是1。 由于范围位在操作数中不能为1,因此不存在值为1的输出位超出范围。

XOR,AND,OR和NOT不产生位结果,结果中的位由input中完全相同位置处的位组合而成。 所以n位input产生的n位没有任何更高的位,那么它怎么会跳出界限呢?

不,它不能。 不像其他人的答案我的将是mathcertificate。

XOR排他性或 排他性 )的快捷方式,可定义为:

 A ⊕ B = (A ∪ B)\(A ∩ B) 

你的论点是这样的

 ∃x: x ∉ A ∧ x ∉ B ∧ x ∈ (A ⊕ B) 

所以从第一个等式

 x ∈ (A ∪ B)\(A ∩ B) 

什么可以表示为

 x ∈ (A ∪ B) ∧ x ∉ (A ∩ B) 

第二部分可以表述为:

 x ∉ A ∧ x ∉ B 

第一部分可以表示为:

 x ∈ A ∨ x ∈ B 

与我们的假设相冲突的是,对于任何集合AB假设x ∉ A ∧ x ∉ B是错误的。

QED

一般情况下 ,所描述的algorithm不能真正在数组中find孤独的整数。 它真正发现的是所有出现奇数次的元素的XOR

所以,如果在那里只有一个“孤独的”元素,说一个元素'a' ,并且所有其他的元素在数组中出现偶数次,那么它就会“按照需要”工作 – >它find这个孤独的元素'a'

为什么?

该algorithm对数组中的所有元素进行XOR (a ^ b ^ c ^ d ^ ...)

XOR操作具有以下属性:

1) a ^ a = 0 (non-equivalence)

2) a ^ 0 = a (neutrality of 0)

3) a ^ b = b ^ a (commutative property)

4) (a ^ b) ^ c = a ^ (b ^ c) (associative property)

举个例子,假设一个数组{a, b, c, a, c, b, a, c}

(元素'a' – 3次,元素'b' – 两次,元素'c' – 3次)

然后,根据上述XOR属性,algorithm结果

R = (((((((a ^ b) ^ c) ^ a) ^ c) ^ b) ^ a) ^ c)

可以重新安排如下:

R = (a ^ b) ^ (c ^ a) ^ (c ^ b) ^ (a ^ c) =

= (a ^ a) ^ (b ^ b) ^ (c ^ c) ^ (a ^ c) =

= 0 ^ 0 ^ 0 ^ (a ^ c) = (a ^ c)

a) 偶发生偶数次的所有元素都为零

b) 所有发生奇数号码的元素都进行异或运算并创build最终结果

XOR是一个按操作,所以它当然不会溢出。

假设

 int xor = x^y; Max value of int is x = 999999999; Max value of Xor will come if y=0; and Max Xor is 999999999; 

这是有限的。 🙂

XOR甚至有可能产生一个不能存储在inttypes中的大整数值?

 Data-Type3 = Data-Type1 operator Data-Type2 

如果这不可能发生,那么是否有证据呢?

在整数情况下, Data-Type3Data-Type1Data-Type2中具有较大尺寸的一种,即使在加法或乘法的情况下也是如此。

 SIZE(Data-Type3) = MAX(SIZE(Data-Type1), SIZE(Data-Type2)) 

所以如果Data-Type1 = Data-Type2那么这也是返回types。

 Short + Short = Short Short + Integer = Integer Short + Long = Long Integer + Short = Integer Integer + Integer = Integer Integer + Long = Long Long + Short = Long Long + Integer = Long Long + Long = Long 

可能发生的是溢出,当一个操作有进位时可能发生溢出。 在2的补码中,进位到高位的列不等于执行高位的列。 阅读更多

但是XOR操作不能溢出 ,因为XOR操作不会产生进位,因为XOR是一个按位操作,如NOT。