1.根据异或符号^的性质来说,异或就是对称差运算,即AUB-A交B 所以有A^0==A,A^A=0. 根据这个性质,定义一个初值为0的一个变量,对整个数组的下标(为了得到一个全集)进行遍历一次,那么非重复的数据会全部存在一个集合里/ 2.然后用这个全集再对这个数组进行遍历,消去重复的,最后只会剩下那个出现两次的数据/

标题若是可以开辟空间,可以用数组嵌套,将第一个数组的值当作第二个数组的下标,出现一次就加1,最后判断值为2的数组下标是谁即可。

标题求数据元素的子集&求的是二进制对应位数的一个交集,也可以用来求二进制1的个数,用一个变量统计即可。

1.&相当于交 根据2进制,开辟相对应的数组与1<<i比较,看他元素的大小,注意这里子集元素不能重复,有重复的需要去重

using namespace std;
void solve(int n, int s)
{
    for (int i = 0; i < n; i++)
    {
        if (s == 0)
        {
            cout << "0";
            break;
        }
        if (s & (1 << i))
        cout << i+1 << " ";
    }
    cout << endl;
}
int main()
{ 
    int n;
    cin >> n;
    for (int i = 0; i <(1<<n) ; i++)
    {
        solve(n,i);
    }
    return 0;
}*/