C++ 两个整数的异或是否会越界?
我一直在研究在数组中查找孤立整数的算法,下面是实现:C++ 两个整数的异或是否会越界?,c++,c,bit-manipulation,integer-overflow,bitwise-xor,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]; } 这将导致一个潜在的大整数,在本例中,该整数不能用数据类型表示,例如int。我的问题是: 甚至有可能XOR会生成无法存储在int类型中的如此大的整数值吗 如果这不可能发
int arr[] = {10, 20, 30, 5, 20, 10, 30};
int LonelyInteger = 0;
for(int i=0; i< 7; i++)
{
LonelyInteger = LonelyInteger ^ arr[i];
}
这将导致一个潜在的大整数,在本例中,该整数不能用数据类型表示,例如int
。我的问题是:
XOR
会生成无法存储在int
类型中的如此大的整数值吗XOR
永远不会越界,因为它组合了位,并且不会在以前没有设置位的地方创建新位
结果5
正确。查看值的二进制表示形式和异或结果
10 00001010
20 00010100
30 00011110
5 00000101
20 00010100
10 00001010
30 00011110
--------------
00000101 => 5
计算多个异或值的结果的一个简单帮助是:结果将有一个位集,其中奇数个位组合在一起,偶数个位没有位集
如果这不可能发生,那么有证据证明这一点吗
XOR
相当于不带进位的加法。当您添加不带进位的位时,不会发生溢出,因此int
值不能超出边界
XOR是否可能生成无法存储在int类型中的如此大的整数值
如果操作数为int,则为no
如果这不可能发生,那么有证据证明这一点吗
嗯,从定义上来说,这是微不足道的。这不是一个数学上严格的证明,但是你可以考虑,如果一个操作数在那个位置有1个,XOR的输出中的一个比特只有1。由于超出范围的位在操作数中不能为1,因此没有值为1的输出位超出范围。(本文适用于C,而不是C++)
由于设置了无效的填充位,按位运算符不能导致陷阱表示,请参见C11 6.2.6.2/1脚注:
…对有效值的算术运算不能生成陷阱
代表
(“算术运算”的含义,但索引链接到6.5.11,这是XOR的定义)
然而,在C中,它们可以导致生成负零。在2的补码中没有负零。但是假设你在一个有1的补码的系统上,那么你可以通过^
生成负零,这可能会导致陷阱表示。6.2.6.2/3明确表示这是可能的:
如果实现支持负零,则只能通过以下方式生成负零:
-具有产生该值的操作数的&、|、^、~、运算符
最后,6.2.6.2/2意味着(无论如何我很确定)不可能有任何表示超过INT\u MAX的整数的值位组合
总之,^
对两个int
的可能结果是:
- 另一个有效的
int
值(可能与相同值的其他版本具有不同但非补漏白的填充位)
- 一个负零,可能会也可能不会导致陷阱
由于运算被定义为组合其操作数的位值,而不是产生任何新位,因此,从其表示所需的位数超过int
提供的位数的意义上讲,结果永远不会“太大”。也许更好的问题是,结果是否可能不是int
的有效值表示
对于无符号整数,否。所有位模式以及所有按位运算的结果都是有效的值表示形式
对于有符号整数,它取决于实现定义的负值表示形式。您可能遇到的每个实现都使用2的补码,其中每个位模式都是有效的;因此,任何按位操作的结果都将是有效的表示形式
然而,该标准还允许其他表示,其中可能存在一个或多个无效位模式。在这种情况下,有两个有效操作数的按位操作可能产生该模式,从而产生无效结果。假设
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、AND、OR、NOT和任何其他按位运算符产生按位结果,结果中的位与输入中的位完全相同。因此,n位输入产生n位,而没有任何更高的位,那么它怎么会越界呢?在一般情况下所描述的算法实际上无法在数组中找到一个孤立的整数。
它真正发现的是奇数次出现的所有元素的异或
因此,如果那里只有一个“孤独”元素,比如一个元素'a'
,而所有其他元素在数组中出现偶数次,那么它“根据需要”工作->它会找到这个孤独的元素'a'
为什么?
该算法执行数组中所有元素的异或(a^b^c^d^…
XOR
操作具有以下属性:
1) a^a=0(非等效)
2) a^0=a(中性为0)
3) a^b=b^a(交换属性)
4) (a^b)^c=a^(b^c)(关联属性)
例如,让我们假设一个包含元素的数组:{a,b,c,a,c,b,a,c}
(元素'a'
-3次,元素'b'
-2次,元素'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)=
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;
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
Data-Type3 = Data-Type1 operator Data-Type2
SIZE(Data-Type3) = MAX(SIZE(Data-Type1), SIZE(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