我们都知道两个二进制字符串的汉明距离是不同位的数量。对于两个二进制字符串:1110和1101,如果我想描述它们与最高位的相同位数的相似性。 (在这个例子中,从左到右,计数位直到两位不同,然后结果是2.) 这种相似性是否已定义或具有正式名称?
答案 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;
}
我没有对此进行评论来解释它是如何/为什么有效的,但如果它能让任何人受益,我会很高兴。