XOR在一定范围内的最大值?

时间:2015-06-14 15:54:10

标签: java algorithm xor

  

给定大小为NxN的矩阵。行和列的编号从0到   N-1。第i行的第j列包含i xor j。换一种说法,   Matrix [i] [j] = i ^ j其中0? i,j< N.你的任务是找到   此矩阵中出现的最大值及其计数   发生。

虽然我的方法是

(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 ;

能够获得理想的结果。如果你们中的任何人都可以用简单的语言给我这个算法的基础,这样我就可以理解这个

1 个答案:

答案 0 :(得分:2)

制作一张Nmaxcount

的表格
N   max   count   how
1     0       1   0^0
2     1       2   0^1, 1^0
3     3       2   1^2, 2^1
4     3       4   1^2, 2^1, 0^3, 3^0
5     7       2   3^4, 4^3
6     7       4   3^4, 4^3, 2^5, 5^2
7     7       6   3^4, 4^3, 2^5, 5^2, 1^6, 6^1
8     7       8   3^4, 4^3, 2^5, 5^2, 1^6, 6^1, 0^7, 7^0
9    15       2   7^8, 8^7
.
.

模式是,在N超过2的幂后,max上升,count返回2。这是因为位模式如下所示:

3 = 0b011
4 = 0b100
.
.
7 = 0b0111
8 = 0b1000

bitN0..N-1中无法设置的最低位(bitN = 8时为N = 8bitN = 16时为N = 9。最大XOR的所有位都设置为bitN以下,这是{_ 1}}在小学减法中借用的逻辑。每当bitN - 1增加1时,计数就会增加两次,除非N增加,当计数重置为2时。计算bitN中的三元运算符的目的是特殊情况count;当N = 1是2的更大幂时,左分支也被占用,但另一个也可以。