【发布时间】:2015-06-15 00:31:11
【问题描述】:
给定一个大小为 NxN 的矩阵。行和列的编号从 0 到 N-1。第 i 行的第 j 列包含 i xor j。换句话说, 矩阵[i][j] = i ^ j 哪里 0 ? i,j
虽然我的方法是
(l..r).each do |i|
(i..r).each do |j|
if (i ^ j > max)
max = i ^ j
end
end
end
我看到了这段代码,根据每个人的说法,它不是二次的,而是在线性时间内找到的。
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long N;
long max = 1L;
long count = 1L;
long bitN ;
StringBuilder sb = new StringBuilder(4*T);
line = br.readLine();
N = Long.parseLong(line);
{
bitN = 1L << getBits(N-1);
max = (bitN - 1);
count = (bitN == N) ? bitN :(N -(bitN>>1))<<1 ;
sb.append(max);
sb.append(" ");
sb.append(count);
sb.append("\n");
}
System.out.println(sb.toString());
}
private static int getBits(long x){
int count = 0;
while(x > 0){
x = x>>1;
count++;
}
return count;
}
}
我无法理解的是这实际上是怎么回事
bitN = 1L << getBits(N-1);
max = (bitN - 1);
count = (bitN == N) ? bitN :(N -(bitN>>1))<<1 ;
能够得到想要的结果。如果你们中的任何人都可以简单地给我这个算法的基本知识,以便我能理解这个
【问题讨论】: