两个二进制字符串之间有这种距离的正式名称吗?

时间:2014-02-09 10:04:31

标签: binary hamming-distance

我们都知道两个二进制字符串的汉明距离是不同位的数量。对于两个二进制字符串:1110和1101,如果我想描述它们与最高位的相同位数的相似性。 (在这个例子中,从左到右,计数位直到两位不同,然后结果是2.) 这种相似性是否已定义或具有正式名称?

1 个答案:

答案 0 :(得分:0)

我咨询了我所在大学的其他几位教师,我们同意,我们没有听说过: - )

然而,这些问题总是很有意思,特别是当我以前没见过它们时......所以我一直在研究解决方案。

作为澄清的一点,我的目标是找到两个数字的二进制值之间的距离(我称之为Confer距离...嘿,为什么不呢?...我喜欢OR Mapper的注释)等效存储长度(比如两个无符号长),你忽略了所有前导0。例如,unsigned short 54090 vs. 3374 ... 54090 = 1101_0011_0100_1010和3374 = 0000_1101_0010_1110。一旦找到最高阶1(最左边),他们在第一个差异之前匹配位模式110_1001,所以距离是7。

下面是我编写的用于查找此距离度量的C ++程序。函数“find_highest_1”和“confer_dist”是相关的。将#define for T更改为任何无符号类型,但要注意,如果选择unsigned char,则不重要且编写错误的数字输入代码将无法正常工作,但距离计算将:-P

#include <iostream>
using namespace std;

/* the type chosen for T MUST be unsigned, but any size is fine */
#define T      unsigned short
#define T_BITS (sizeof(T) * 8)

string print_bin(T num) {
    string result = "0b";
    for(int i = T_BITS - 1; i >= 0; i--) {
        if((i + 1) % 4 == 0) result.append("_");
        result.append(to_string((num & (((T)1) << i)) >> i));
    }
    return result;
}

int find_highest_1(T num) {
    int i = -1; // -1 matters here because of how the Confer Distance is found

    if(num != 0) {
        i = 0;
        for(int shift = T_BITS / 2; shift >= 1; shift >>= 1) {
            if(num & (~(T)0) << shift) {
                num >>= shift;
                i += shift;
            }
        }
    }
    return i;
}

int confer_dist(T a, T b) {
    int len_a = find_highest_1(a) + 1;
    int len_b = find_highest_1(b) + 1;
    int min_length;

    min_length = (len_a < len_b) ? len_a : len_b;
    a >>= len_a - min_length;
    b >>= len_b - min_length;

    return min_length - find_highest_1(a ^ b) - 1;
}

int main(int argc, const char * argv[])
{
    T num1, num2;
    cout << "enter two numbers: ";
    cin >> num1 >> num2;

    cout << "num1 = " << print_bin(num1) << endl;
    cout << "num2 = " << print_bin(num2) << endl;

    cout << "Confer dist: " << confer_dist(num1, num2) << endl;
    return 0;
}

我没有对此进行评论来解释它是如何/为什么有效的,但如果它能让任何人受益,我会很高兴。