Minimize XOR

medium bitwise greedy

Problem

You are given two positive integers num1 and num2. Construct a positive integer x that has exactly as many set bits (1s in binary) as num2, placed so that x XOR num1 is as small as possible. The optimal x is unique; return it.

Inputnum1 = 9, num2 = 30
Output15
num2 = 11110 (binary) has four 1s. Matching num1 = 1001 at bits 3 and 0, then filling the lowest zeros (bits 1 and 2) gives x = 1111 = 15, and 15 XOR 9 = 6 is the minimum possible.

def minimize_xor(num1, num2):
    k = bin(num2).count("1")
    x = 0
    for b in range(31, -1, -1):
        if k and (num1 >> b) & 1:
            x |= 1 << b
            k -= 1
    b = 0
    while k:
        if not (x >> b) & 1:
            x |= 1 << b
            k -= 1
        b += 1
    return x
function minimizeXor(num1, num2) {
  let k = 0;
  for (let b = 0; b < 32; b++) if ((num2 >> b) & 1) k++;
  let x = 0;
  for (let b = 31; b >= 0; b--) {
    if (k > 0 && ((num1 >> b) & 1)) {
      x |= 1 << b;
      k--;
    }
  }
  for (let b = 0; k > 0; b++) {
    if (!((x >> b) & 1)) {
      x |= 1 << b;
      k--;
    }
  }
  return x;
}
int minimizeXor(int num1, int num2) {
    int k = Integer.bitCount(num2);
    int x = 0;
    for (int b = 31; b >= 0; b--) {
        if (k > 0 && ((num1 >> b) & 1) == 1) {
            x |= 1 << b;
            k--;
        }
    }
    for (int b = 0; k > 0; b++) {
        if (((x >> b) & 1) == 0) {
            x |= 1 << b;
            k--;
        }
    }
    return x;
}
int minimizeXor(int num1, int num2) {
    int k = __builtin_popcount(num2);
    int x = 0;
    for (int b = 31; b >= 0; b--) {
        if (k > 0 && ((num1 >> b) & 1)) {
            x |= 1 << b;
            k--;
        }
    }
    for (int b = 0; k > 0; b++) {
        if (!((x >> b) & 1)) {
            x |= 1 << b;
            k--;
        }
    }
    return x;
}
Time: O(log max(num1, num2)) Space: O(1)