实际上,这道题目很假,打表就可以
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))
对于,特判

京公网安备 11010502036488号