两个整数的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
。 我的问题是:
-
XOR
甚至有可能产生一个不能存储在int
types中的大整数值? - 如果这不可能发生,那么是否有证据呢?
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
与我们的假设相冲突的是,对于任何集合A
和B
假设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-Type3
是Data-Type1
和Data-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。