intfind_duplicate(int nums[], int n) { int res = 0; for (int i = 0; i < n; i++) { // 所有数异或 res ^= nums[i]; // T^x } for (int i = 1; i < n; i++) { // 所有不重复的数异或 res ^= i; // res := (T^x)^T } return res; }
int* singleNumber(int* nums, int numsSize, int* returnSize){ int *ans = (int *)malloc(2 * sizeof(int)); long xor = 0, lsb = 0; // 防止溢出风险 for (int i = 0; i < numsSize; ++i) { xor ^= 1LL * nums[i]; } lsb = xor & (~xor + 1); ans[0] = 0, ans[1] = 0; for (int i =0; i < numsSize; ++i) { if ((nums[i] & lsb) != 0) { ans[0] ^= nums[i]; } } ans[1] = xor ^ ans[0]; (*returnSize) = 2; return ans; }
是如何计算上述序号 2 中的那个二进制数的呢?
一个整数 x 与(~x+1)进行按位与运算的结果是将 x 的最右边的 1 保留下来,其他位都置为 0。这个操作通常用于获取 x 的最右边的 1 所代表的值,也可以称为获取 x 的最低有效位(LSB)。
举个例子,假设 x 的二进制表示为 10110100,那么 ~x 的二进制表示为 01001011,然后再加上 1,得到 (~x+1) 的二进制表示为 01001100。最后,将 x 与(~x+1)进行按位与运算,得到的结果就是 00000100,即 x 的最右边的 1 所代表的值为 4。