我一直在研究在数组中查找孤独整数的算法,这里是实现:
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
。我的问题是:
XOR
甚至可能生成无法存储在int
类型中的大整数值吗?答案 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
假设A
和B
错误的假设相冲突。
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-Type1
和Data-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。