【问题标题】:Matching bits algorithm匹配位算法
【发布时间】:2013-04-20 03:58:09
【问题描述】:

我有一个问题,我需要找到两个整数之间的匹配位数(从左到右)

输入:2 个变量 A 和 B 来存储我的十进制数

输出:A 和 B 中匹配的位数(从左侧开始)

一些例子:

A = 3 and B = 2,A 和 B 位最多匹配左起 7 位

A = 3 and B = 40,A 和 B 位最多匹配左起 7 位。

如何使用按位运算(AND、OR、XOR)来做到这一点?

谢谢

【问题讨论】:

  • 我不明白这个问题。 A=3B=2的结果如何等于7

标签: bit-manipulation bit


【解决方案1】:

XOR 两者一起(产生一个从左边到第一个不匹配元素全为零的数字),然后将结果右移直到等于 0。从您正在处理的整数的位长度中减去它(例如,您似乎在暗示 8 位)。

伪代码:

int matchingBits(A, B) {
    result = A XOR B
    int shifts = 0
    while (result != 0) {
        result = result >> 1 (Shift right the result by 1)
        shifts++
    }
    return integer_bit_length - shifts
}

【讨论】:

    【解决方案2】:

    执行 (A XNOR B) 以找到匹配的数字:

    10101010
    01001011
    --XNOR--
    00011101
    

    然后使用汉明算法计算个数:Count number of 1's in binary representation

    (顺便说一句:xnor 是 !xor)

    【讨论】:

    • 这个统计匹配位的总数,他要从左边到第一个不匹配的匹配位的个数
    【解决方案3】:

    试试这个可能会奏效

    int matchingBitsCount(val1,val2)
    {
      int i , cnt = 0;
      for(i=7;i>=0;i--)
     {
           if(((1<<i)&a)^((1<<i)&b))==0)  //left shifted for starting from left side and then XOR
           {
           cnt++;
           }
          else
          {
            break;
          }
       }
     }
    

    如果您想检查 int,我将 val1 和 val 2 作为 char,然后只需 i=31

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-18
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 2016-07-02
      • 2016-05-29
      • 2015-10-20
      相关资源
      最近更新 更多