c++ - 两个整数的异或可以超出界限吗?

标签 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. 如果这不可能发生,那么有证据证明吗?

最佳答案

XOR 永远不会越界,因为它会组合位并且不会在之前没有设置位的情况下创建新位。

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

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

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

If it is not possible that this can happen then is there a proof for this?

XOR 等价于不进位的加法。当您添加不带进位的位时,不会发生溢出,因此 int 值不会超出范围。

关于c++ - 两个整数的异或可以超出界限吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28320454/

相关文章:

c++ - 如何找到参数包的长度?

c - C中##预处理器有什么用

C 首字母大写

c++ - 将 2 字节数分成两个 1 字节

c++ - 按位整数连接

c++ - 使用 glibc 和 libstdc++ 静态链接

c++ - 结构未完成排序

c++ - 十六进制、二进制和八进制到十进制转换器不能正常工作 C++

c - 参数与原型(prototype) : struct in_addr 不兼容

MySQL 按位与 256 位二进制值