两个整数的XOR可以超出界限吗?

时间:2015-02-04 11:39:26

标签: c++ c bit-manipulation integer-overflow bitwise-xor

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

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]

这会导致一个潜在的大整数,在这种情况下无法用数据类型表示int。我的问题是:

  1. XOR甚至可能生成无法存储在int类型中的大整数值吗?
  2. 如果不可能发生这种情况,那么有证据吗?

10 个答案:

答案 0 :(得分:120)

XOR永远不会超出界限,因为它结合了比特并且不会创建之前没有设置位的新比特。

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

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

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

  

如果不可能发生这种情况,那么有证据吗?

XOR相当于在不携带单个位的情况下添加。在没有进位的情况下添加位时,不会发生溢出,因此int值不会超出范围。

答案 1 :(得分:37)

结果永远不会太大&#34;在其表示意义上需要比int提供的更多的位,因为操作被定义为组合其操作数的位值,而不产生任何新位。也许更好的问题可能是,结果是否可以是int的有效值表示以外的其他内容?

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

对于有符号整数,它取决于实现定义的负值表示。您可能遇到的每个实现都使用2-s补码,其中每个位模式都有效;所以,任何按位运算的结果都是有效的表示。

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

答案 2 :(得分:26)

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

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

  

...对有效值无算术运算可以生成陷阱   表示...

(&#34;算术运算&#34; is unclear的含义,但索引链接到6.5.11,这是XOR的定义。

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

  

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

     

- &amp;,|,^,〜,&lt;&lt;&lt;&gt;&gt;具有产生这种值的操作数的运算符;

最后6.2.6.2/2暗示(我非常确定无论如何)它不可能有任何值位组合表示超过INT_MAX的整数


总结一下,^对两个int的可能结果是:

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

答案 3 :(得分:20)

严格来说,你不能XOR两个整数。你可以对两个整数大小的包进行异或,你可以在其他时间将这些包作为整数处理。您甚至可以在所有其他时间将它们视为整数。

但是当你执行XOR操作时,你将它们视为与整数甚至数字完全不同的东西,本身 :它们只是两个比特序列,其中相应的比特被比较。溢出的概念不适用于此,因此如果您决定将结果视为整数,它也不会溢出。

答案 4 :(得分:11)

  

甚至可能XOR会生成一个无法存储在int类型中的大整数值吗?

如果操作数为int,则为否。

  

如果不可能发生这种情况,那么有证据吗?

嗯,从定义来看,它是微不足道的。这几乎不是数学上严格的证明,但你可以认为,如果其中一个操作数在该位置有1,那么XOR输出中的一点只会是1。由于操作数中超出范围的位不能为1,因此没有值为1的输出位超出范围。

答案 5 :(得分:10)

XOR,AND,OR,NOT和任何其他按位运算符产生按位结果,结果中的位由输入中完全相同位置的位组合而成。所以n位输入产生n位而没有任何更高的位,那么它怎么能脱离界限呢?

答案 6 :(得分:10)

不,不能。与其他答案不同,我的数学证据就是数学证明。

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

x ∉ A ∧ x ∉ B假设AB错误的假设相冲突。

Q.E.D。

答案 7 :(得分:7)

GENERAL CASE 中,所描述的算法无法在数组中找到孤立的整数。 它真正发现的是XOR所有元素在那里发生奇数次。

所以,如果那里只有一个'孤独'元素,说一个元素'a',并且所有其他元素在数组中出现偶数次,那么它可以“按要求”工作 - &gt;它找到了这个孤独的元素'a'

为什么?

该算法执行数组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属性,算法结果

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)... 所有出现ODD次数的元素都是XOR-ed 并创建最终结果

XOR按位操作,当然它永远不会溢出。

答案 8 :(得分:3)

假设

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;

这是有限的。 :)

答案 9 :(得分:1)

  

甚至可能XOR会产生如此大的整数值   那个不能存储在int类型中?

Data-Type3 = Data-Type1 operator Data-Type2
  

如果不可能发生这种情况,那么就有证据证明   此?

我们Data-Type3如果整数是Data-Type1Data-Type2中有一个更大的,即使是加法或乘法也是如此。

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

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

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的补码中,当进入高阶列的进位不等于高阶列的进位时。 read more

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