汉明距离的计算

article/2025/9/20 5:32:47

汉明距离,作为一种衡量特征距离的计算方法,在很多场合都有应用,其主要思想是找到两个特征之间的差异大小,也可以说是相似性。

我是在图像处理中用到的,项目中需要计算图像梯度方向,我选择了四个方向,这样就可以用二位二进制表示,分别为 0,1,2,3,也就是 00,01,10,11,这四种情况。这样,我就可以可以把,例如四个临近点,对应梯度特征合并为一个特征向量,如图


只需要一个字节的大小空间就可以表示一个特征。那么,我来用这个特征描述两张图, 假设A,B,就得到了两个特征,featureA,featureB,在假设图像大小为100*100的8bit灰度图像,选择水平方向的四个像素,那么我就可以得到 100*25个单字节的描述特征。接下来,我要怎么衡量这两张图是不是相似,就要用到汉明距离(其他距离也可以,这里直说汉明距离)。如果两个图像在这种特征下是相似的,那意味着他们特征的对应比特位应该是尽可能多的一致,也就是说,featureA ^ featureB ,特征的异或结果中1 的个数尽可能的少。这就涉及到,我们如何计算1的个数。这在leetcode和剑指offer等书中都有类似笔试面试题。

常规解法就是移位判断是不是1,是则计数,需要注意,应该要判断给定数(这里用tmp表示)的符号,否则可能死循环。

  1. int CountOne(int tmp)
  2. {
  3. int count= 0;
  4. if( 0==tmp)
  5. return count;
  6. else if(tmp> 0)
  7. {
  8. while(tmp)
  9. {
  10. if(tmp& 1)
  11. ++count;
  12. tmp=tmp>> 1;
  13. }
  14. }
  15. else
  16. {
  17. tmp=-tmp;
  18. count= 1;
  19. while(tmp)
  20. {
  21. if(tmp& 1)
  22. ++count;
  23. tmp=tmp>> 1;
  24. }
  25. }
  26. return count;
  27. }

这样还是不方便,我们可以不对tmp移位:

  1. int CountOneVersion2(int tmp)
  2. {
  3. int flag= 1;
  4. int count= 0;
  5. while(flag)
  6. {
  7. if(flag&tmp)
  8. ++count;
  9. flag=flag<< 1;
  10. }
  11. return count;
  12. }


这样就少去了判断符号的麻烦。

还有一种解法,那就是考虑到tmp每次减一后,最后一位1都会发生变化,这样我们把剩下的保留,下次再减一,知道tmp为零位置,这样就可以知道其中1的个数。

  1. int CountOneVersion3(int n)
  2. {
  3. int count= 0;
  4. while(n)
  5. {
  6. ++count;
  7. n=n&(n -1);
  8. }
  9. return count;
  10. }


以上是采用移位的方法,我们还可以不用移位,那就是下面的快速汉明距离计算的问题。我们先取三个数,这里考虑unsigned char 型,也就一个字节的情况。分别是 AA=85,即01010101,BB=51,即00110011,CC=15,即00001111;主要思想就是计算1的和,(1)一行是计算相邻两个位置的和,得到的结果最多需要两位,然后(2)一行在计算相邻四个位置的和,计算结果最多需要四位.(3)一行再把高四位和低四位相加,得到的就是1的个数。


  1. unsigned char A,B,Ch,D;
  2. const unsigned char AA = 85;
  3. const unsigned char BB = 51;
  4. const unsigned char CC = 15;
  5. A = tmp; B = A&AA; Ch = (A>> 1)&AA; //(1)
  6. D = B+Ch; B = D &BB; Ch = (D>> 2)&BB; //(2)
  7. D = B+Ch; B = D & CC; Ch = (D>> 4)&CC; //(3)
  8. ss += B+Ch;


应为是在硬件上实现,所以每个时钟周期都要计较,要做性能优化,通过这样的位运算,能够显著提升速度,这种计算单元重复度相当高,所以性能会提升很多。



http://chatgpt.dhexx.cn/article/OvFg3O8M.shtml

相关文章

汉明距离问题详解

https://leetcode.cn/problems/hamming-distance/solution/yi-ming-ju-chi-by-leetcode-solution-u1w7/ 前言 汉明距离广泛应用于多个领域。在编码理论中用于错误检测&#xff0c;在信息论中量化字符串之间的差异。 两个整数之间的汉明距离是对应位置上数字不同的位数。 根据…

介绍汉明距离及计算示例

汉明距离(Hamming distance)是计算两个向量之间不同对应元素数量之和。本文介绍R、Python语言的计算过程。 汉明距离概述 汉明距离是以美国数学家理查德汉明的名字命名的&#xff0c;他在1950年关于汉明码的论文中提出了该举例度量指标。它被广泛用于多个学科&#xff0c;如信…

汉明距离讲解

文章目录 汉明距离的计算最小汉明距离汉明距离纠错例题 汉明距离的计算 码字A为 10001001 码字B为 10110001 那么不同的字符数为3&#xff0c;汉明距离就是3 不难看出&#xff0c;汉明距离就是两个码不同的数的个数。 最小汉明距离 在一个码组集合中&#xff0c;任意两个码…

距离度量 —— 汉明距离(Hamming Distance)

Python学习系列文章&#xff1a;&#x1f449; 目录 &#x1f448; 文章目录 一、概述二、计算方式三、汉明重量 一、概述 汉明距离&#xff08;Hamming Distance&#xff09;&#xff0c;就是将一个字符串变成另一个字符串所需要的替换次数。 二、计算方式 举个例子&#…

【猿知识】汉明距离(Hamming Distance)

文章目录 汉明距离汉明重量汉明距离计算汉明距离应用例子参考 汉明距离是以理查德卫斯里汉明的名字命名的&#xff0c;汉明在误差检测与校正码的基础性论文中首次引入这个概念。在通信中累计定长二进制字中发生翻转的错误数据位&#xff0c;所以它也被称为信号距离。 汉明距离…

js设置居中

我们在编写html页面的时候&#xff0c;不可避免的会遇到元素居中的问题&#xff0c;水平居中还好说 我们可以通过设置margin: auto;text-align: center;来实现水平居中。垂直居中的话&#xff0c;单个标签我们可以通过设置line-height来实现垂直居中&#xff0c;但是多个标签的…

CSS常见图片居中,文字居中,版心居中集合

1.margin:0 auto&#xff1b;&#xff08;水平居中&#xff09; 适用于&#xff08;块级元素&#xff09; wrapper&#xff08;wrapper只负责版心的效果&#xff09;定义一个固定的宽度&#xff1b;margin&#xff08;外边距&#xff09;左右的值设置为auto。 让带有wrapper…

垂直居中的方法

总结垂直居中的方法 <div class"layout-wrapper"><div class"box1"><h4>垂直居中方法</h4></div></div>.layout-wrapper{width:300px;height:300px;border: 1px solid red; } .box1{height:150px;width:150px;border…

win10任务栏怎样居中win10任务栏居中设定教程

win11系统内置任务栏居中的设置项&#xff0c;但是win10系统没有&#xff0c;倘若win10顾客也想让自己的任务栏居中的话&#xff0c;应当怎样设置呢&#xff1f;你先撤销任务栏锁住&#xff0c;随后新建菜单栏。之后选定一个空白文件夹&#xff0c;之后任务栏就会发生两条竖杠&…

HTML+CSS,让div在屏幕中居中(水平居中+垂直居中)方法总结

最近写网页经常需要将div在屏幕中居中显示&#xff0c;遂记录下几个常用的方法&#xff0c;都比较简单。 水平居中直接加上<center>标签即可&#xff0c;或者设置margin:auto;当然也可以用下面的方法 下面说两种在屏幕正中&#xff08;水平居中垂直居中&#xff09;的方…

css字体居中(css字体居中对齐)

css如何让表格居中 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。 关于网页设计CSS文本垂直居中的问题 text-align:center;文本居中显示 vertical-align…

css图片居中

相信很多工程师都搜索过css图片居中的方法吧&#xff0c;但总是出现各种各样的问题。其实css图片居中分为很多种情况 第一种&#xff1a;已知父元素的高度&#xff0c;单独设置文字水平垂直居中&#xff0c;我们只需要设置css样式line-hight:同父元素高度&#xff0c;text-alig…

html中如何居中

第一步&#xff1a;打开网页编辑器&#xff0c;新建一个网页文件。 第二步&#xff1a;我们编写两个div标签用来做一个对比演示&#xff0c;既嵌套式div。 第三步&#xff1a;首先我想让最外层的div进行真正意义上的居中——既在浏览器页面水平方向和垂直方向都居中显示。 …

HTML中进行居中设置

html居中的方法如下&#xff1a; 1、打开HTML的编辑器。 2、找到需要居中的图片或者文字。 3、在body里面&#xff0c;设置CSS样式。 4、添加样式为&#xff1a;text-align&#xff1a;center &#xff1b;即可。 超文本标记语言&#xff08;Hyper Text Markup Language&a…

div居中

HTML的div居中 一、margin:0px auto; 给需要居中的div设置一个宽度&#xff0c;然后设置元素的上下外边距为 相等 左右外边距为 auto&#xff0c;比如&#xff0c;margin:0px auto。 则可以实现 div 居中显示。 对于浮动元素&#xff0c;设置其左右外边距为关键字 auto 是无效…

HTML元素居中(文字居中,块居中【垂直/水平居中】)

一、文字、行内元素水平居中 给父级属性设置text-align: center即可 HTML代码: <div><p>p</p></div> <div><span>span</span></div> <div><a href"#">a</a></div>CSS代码&#xff1a; …

html让文字居中

html让文字居中的方法&#xff1a;1、给文本所在标签加CSS属性值“text-align:center”&#xff1b;2、在行内标签或行内块级标签中加CSS属性值“text-align:left”。 本文操作环境&#xff1a;windows7系统、HTML5&&CSS3版、Dell G3电脑。 两种情况&#xff1a;1、文…

word文字居中怎么设置

电脑编辑文档时&#xff0c;想要把文字内容居中显示&#xff0c;那么word怎么居中文字&#xff0c;今天和大家一起学习下。 方法1 1&#xff0c;打开新建的word文档&#xff0c;输入文字。 2&#xff0c;选中文字&#xff0c;然后点击工具栏的“居中对齐”&#xff0c;确定即…

8种css居中实现的详细实现方式了

这是一篇关于居中对齐方式的总结 开篇之前&#xff0c;先问一下大家都知道几种居中的实现方式&#xff1f; 面试时答出来两三个就不错了&#xff0c;就怕面试官还让你继续说。今天就来总结一下这些居中的方式 使用flex布局设置居中。使用flex 时也能通过给子项设置margin: au…

各种居中方法汇总(究极版)

本文部分参考文章&#xff1a;https://github.com/ljianshu/Blog/issues/29 每一部分后另附相关实践代码 前言 本文主要介绍水平居中&#xff0c;垂直居中&#xff0c;还有水平垂直居中各种办法&#xff0c;思维导图如下&#xff1a; 一、水平居中 1.行内元素水平居中 利用…