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