【问题标题】:Interview question: Number of bit swaps required to convert one integer to another面试问题:将一个整数转换为另一个整数所需的位交换次数
【发布时间】:2010-11-08 00:07:29
【问题描述】:

我的一个朋友在一次采访中被问到这个问题。我无法找到解决方案。 问题 -

编写一个函数来计算将一个整数转换为另一个整数所需的位交换次数。

【问题讨论】:

  • 有特定的语言吗?
  • 是否知道两个整数的0位数和1位数相同?
  • @Omnifarious - 不,此信息未知
  • 不清楚你必须做什么:切换位(XOR)或交换数字中的位对(前置条件:num_1bit(N1) == num_1bit(N2))。

标签: bit-manipulation


【解决方案1】:

可以用来判断哪些位不同的位运算是异或。 xor 值中的每个1 将告诉两个整数之间的不同位。

int getBitSwapCount(int x, int y) {
    int count = 0;
    for(int z = x^y; z!=0; z = z>> 1) {
        count += z & 1;
    }
    return count; 
}

【讨论】:

  • 不正确。 :-) 他们不想要不同位的数量,而是交换的数量。
  • 不同位的数量与需要的交换次数相同
  • @Omnifarious && @user45* :是的,如果不同的位应该与需要的交换数相同
  • 此解决方案的一个小问题极端案例:如果 (1) 您正在处理有符号整数,并且 (2) x^y恰好是负数,并且 (3​​) 您首选语言中的 >> 运算符在这种情况下执行算术移位,然后您将最终进入无限循环,因为z 永远不会变为零。
  • 不,这是不同位数的一半。 1100 ^ 1010 = 0110 = 2 bits = 1 swap(中间的0和1)
【解决方案2】:

面试问题不仅与解决方案有关,而且(这通常比找到解决方案更重要)让您有机会展示您将如何解决此类新问题。你会如何开始呢?您是否想了解更多信息来帮助您解决问题?您想使用任何标准函数(使用任何常用的编程语言)吗?

给我们你最好的机会,我们将扮演面试官并在你走的时候提示......

【讨论】:

    【解决方案3】:

    对值进行异或运算,然后计算结果中的个数

    【讨论】:

    • 为什么是零?如果 x1 = 0 且 x2 = 0 则 x1 xor x2 = 0,即所有位置都为零,但不需要交换。可以算数吗?
    【解决方案4】:

    我看不出这个问题有什么特别之处。遍历两个整数的位,通过 XOR 组合当前位并在结果不等于 0 时增加计数器,将为您提供两个值不同的位数。

    【讨论】:

      【解决方案5】:

      不同的方法

      找到二进制字符串并通过动态规划计算Levenshtein distance

      【讨论】:

        【解决方案6】:

        取 2 个数字的异或(比如 a 和 b),并计算 a^b 中的个数

        int bitsSwapRequired (int a, int b){
            int count = 0;
            for (int c = a ^ b; c!=0 ; c >> 1)
                count += c & 1;
            return count;
        }
        

        我们可以做得更好一点,而不是简单地在检查最低有效位的同时重复移动 c,我们可以不断地将最右边的位翻转为 1,并计算 c 到达 0 需要多长时间。运算 c = c & (c-1) 将清除 c 中设置为 1 的最右边的位。

        int bitsSwapRequired (int a, int b){
            int count = 0;
            for (int c = a ^ b; c != 0; c = c & (c-1))
                count ++;
            return count;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-22
          • 1970-01-01
          • 2021-11-02
          • 1970-01-01
          • 2019-08-17
          • 1970-01-01
          • 2020-05-25
          相关资源
          最近更新 更多