实际上,这道题目很假,打表就可以

    for (int i = 1; i <= 11; i++) {
        for (int j = 1; j <= 11; j++) printf("%d ", i ^ j);
        puts("");
    }

打表之后发现两个规律 第一,形如10000...0这样的,不管怎么样都构造不出10000....0 因为要构造出1000...0当且仅当要和 异或起来,这做不到

第二,形如100..1(中间有额外的1)...0这样的,可以构造出从[1...(11111...1)]区间里面的任意数,因为最高位的那个1可以下放,而有多余的那个额外的1,保证了低位异或的每一位,都可以填0 或 1

综上所数,形如1000..0,答案是(1 << high)high表示最高位的那个1的位数 否则,答案是(1<< (high+1))

对于,特判