1. 程式人生 > >Hamming Distance漢明距離

Hamming Distance漢明距離

引子

第一次聽說漢明距離來源於一次面試,當時問了個題目:
已知一個無符號的二進位制整數n,int長度,求二進位制中1的個數

方法1:直接數

最簡單的方法,挨個挨個數,宣告一個計數變數,當尾數為1時加1,然後把n右移1位,直到該數為0為止
int Method01(int n)
{
	int count(0);	//宣告計數變數
	while (n != 0)
	{
		count += n & 1;
		n >>= 1;	//右移
	}
	return count;
}

方法2:n和n-1相與最低位永遠為0

直接數這種粗暴的方法肯定不是效率低下的,把每一位都考慮到,而沒有進行篩選。 
這裡是只統計1的個數,那怎樣把1一個一個取出來呢?既能統計到個數,也要不能影響到其他未統計的1。考慮這樣一個規律:n和n-1相與,最低位始終為0。 

e.g.: 


n 0101 1000
n - 1 0101 0111
n & (n - 1) 0101 0000

這樣的話,最後一個1已經全部換成0了,而其他1也沒有產生影響。
int Method02(int n)
{
	int count(0);
	while (n != 0)
	{
		n &= n - 1;
		++count;
	}
	return count;
}
這個方法在n的大多資料位為0時,效率最高,因為只統計了一的次數。  引申1:如果判斷一個數為2的冪次方:(n > 0) && ((n & (n - 1)) == 0)
引申2:如果n的大多資料位為1時,可以將n &= n - 1替換為 n | (n - 1) = 0xFF

方法3:Hamming Weight

採用分冶的思想,為了統計4個位元組的中有1的個數,將資料的相鄰兩位分成一組,統計出每組中含有1的個數:
比相鄰的兩位x=10構成一組,要統計這組含有1的個數,低位中1的個數:x & 01,高位中1的個數(x >> 1) & 01。這裡n為4byte,則表示為n & 0x55555555 + (x >> 1) & 0x55555555。

將上一步計算的結果儲存到n中,再將每相鄰兩組即4位構成新一組,再進行計算,如此只須做4次運算,即可得出最終結果。

e.g.:  以8bit為例

n = 0110 1100

0x55 = 0101 0101

---------------------------------------------------------------------------------------------------------------------

n = |0 1|1 0|1 1|0 0|                    將n按每兩位分成一組

----------------------------------------------------------------------------------------------------------------------

   |0 1|0 0|0 1|0 0|                                  n與0x55=0101 0101相與的結果:低位中為1的個數

+ |0 0|0 1|0 1|0 0|                                  n>>1與0x55=0101 0101相與的結果:高位中為1的個數

= |0 1|0 1|1 0|0 0|                                  將兩個結果相加

= |0 1 0 1|1 0 0 0|                                  4個一組

----------------------------------------------------------------------------------------------------------------------

  |0 0 0 1|0 0 0 0|                                    n與0x33=0011 0011相與的結果

+|0 0 0 1|0 0 1 0|                                    n>>2與0x33=0011 0011相與的結果

=|0 0 1 0|0 0 1 0|                                    相加

=|0 0 1 0 0 0 1 0|                                    8個一組

----------------------------------------------------------------------------------------------------------------------

  |0 0 0 0 0 0 1 0|                                    n與0x0F=0x0000 1111相與的結果

+|0 0 0 0 0 0 1 0|                                    n>>4與0x0F=0x0000 1111相與的結果

=|0 0 0 0 0 1 0 0|                                    相加

= 4                                                             最終結果,即為4

對於4byte的int型,程式碼如下:

int Method03_HammingWeight(int n)
{
	n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
	n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
	n = (n & 0x0F0F0F0F) + ((n >> 4) & 0x0F0F0F0F);
	n = (n & 0x00FF00FF) + ((n >> 8) & 0x00FF00FF);
	n = (n & 0x0000FFFF) + ((n >> 16) & 0x0000FFFF);
	return n;
}

上述程式碼就為Hamming Weight

程式碼

程式碼連結:

應用

  • 相似度檢測

相關推薦

477 Total Hamming Distance 距離總和

CP 一個數 logs lee pub 範圍 -h ble min 兩個整數的 漢明距離 指的是這兩個數字的二進制數對應位不同的數量。計算一個數組中,任意兩個數之間漢明距離的總和。示例:輸入: 4, 14, 2輸出: 6解釋: 在二進制表示中,4表示為0100,14表示為1

練習2:Hamming Distance距離

turn 異或操作 二進制位 十進制 min 範圍 get col 最終 1、鏈接地址   https://leetcode.com/problems/hamming-distance/description/ 2、題目要求   漢明距離指兩個整數的二進制表示中,對應位置數

LeetCode 461 Hamming Distance 距離

解法一: class Solution { public:     int hammingDistance(int x, int y) {         int z=x^y;         int count=0;         while(z)         {

[LeetCode] Hamming Distance 距離

#include using namespace std; int num_of_bits[35] = {0}; class Solution { public: int hammingDistance(int x, int y) { // int num_of_bits[35] = {0}

[Leetcode,python] Hamming Distance 距離

問題描述: The Hamming distance between two integers is the number of positions at which the correspondin

Leetcode 461. Hamming Distance 距離 解題報告

1 解題思想 這道題就是求兩個數的海明距離,而海明距離也就是兩個數對應的二進位制bit位裡不同的位數 所以這道題直接異或就可以,異或時,二者相同為0,不同為1,異或完後統計為1的位數就好 2 原題

Hamming Distance距離

引子 第一次聽說漢明距離來源於一次面試,當時問了個題目: 已知一個無符號的二進位制整數n,int長度,求二進位制中1的個數 方法1:直接數 最簡單的方法,挨個挨個數,宣告一個計數變數,當尾數為1時加1,然後把n右移1位,直到該數為0為止 int Method01(int n

Leetcode-Algorithms Hamming Distance(距離

從今天開始每天用python做幾道leetcode的題目練手,從easy到hard遞進。 The Hamming distance between two integers is the number of positions at which the cor

477. Total Hamming Distance 總的距離

blog += all out xpl bject end min which The Hamming distance between two integers is the number of positions at which the correspondi

leetcode-461-距離(hamming distance)-java

題目及測試 package pid461; /* 漢明距離 兩個整數之間的漢明距離指的是這兩個數字對應二進位制位不同的位置的數目。 給出兩個整數 x 和 y,計算它們之間的漢明距離。 注意: 0 ≤ x, y < 231. 示例: 輸入: x = 1, y = 4

(java)leetcode461 距離Hamming Distance

題目描述: 兩個整數之間的漢明距離指的是這兩個數字對應二進位制位不同的位置的數目。(漢明距離是使用在資料傳輸差錯控制編碼裡面的,漢明距離是一個概念,它表示兩個(相同長度)字對應位不同的數量,我們以d(x,y)表示兩個字x,y之間的漢明距離。對兩個字串進行異或運算,並統計結果為1的個數,那麼這

leetcode461 距離Hamming Distance

題目描述: 兩個整數之間的漢明距離指的是這兩個數字對應二進位制位不同的位置的數目。(漢明距離是使用在資料傳輸差錯控制編碼裡面的,漢明距離是一個概念,它表示兩個(相同長度)字對應位不同的數量,我們以d(x,y)表示兩個字x,y之間的漢明距離。對兩個字串進行異或運算,並統計結果

[LeetCode] Total Hamming Distance 全部距離

The Hamming distance between two integers is the number of positions at which the corresponding bits are different. Now your job is to find the total Ha

leetcode_461. Hamming Distance 計算距離,按位異或運算,計算整數的二進位制表示中1的個數 java

題目: The Hamming distance between two integers is the number of positions at which the corresponding bits are different. Given two int

兩個整數對應的二進位制距離----hamming distance

漢明距離,就是兩個數對應的二進位制數不相同的位數的個數例如:1---001,4---100,有兩個不相同的位數,所以漢明距離為2分為兩個步驟1.求出不相同的位數是哪些位,異或^,x^y,求出的結果為1的位數即為不相同的位數2求出為1的位數有幾位,可以採用以下思路將異或後的結果

Python的二進位制數位運算,計算距離Hamming Distance)為例

Python的二進位制數操作,計算漢明距離(Hamming Distance)為例 最近發現了LeetCode這個好網站,做了幾道題,今後刷LeetCode學習到的新知識我都儘量抽時間記錄下來,同時分享給大家。 今天就從LC上一道題說起: Giv

opencv:L1距離,L2距離,顏色失真(color distortion),距離hamming distance),LUT

#pragma once #include <opencv2/core/types_c.h> //! computes the L1 distance between two integer values template<typename T>

leetcode 461. 距離(Hamming Distance)

進制 不同 != https 距離 clas strong tro tle 目錄 題目描述: 示例: 解法: 題目描述: 兩個整數之間的漢明距離指的是這兩個數

各種距離 歐式距離、曼哈頓距離、切比雪夫距離、閔可夫斯基距離、標準歐氏距離、馬氏距離、余弦距離距離、傑拉德距離、相關距離、信息熵

form 密碼學 一行 and gif 國際象棋 matlab 三維空間 ffi 1. 歐氏距離(Euclidean Distance) 歐氏距離是最容易直觀理解的距離度量方法,我們小學、初中和高中接觸到的兩個點在空間中的距離一般都是指歐氏距離。 二維平面上點a(x1,

統計二進制中1的個數(LeetCode 461. 距離 or LeetCode 191. 位1的個數)

des 計算 com strong problem 兩個 desc 不同的 esc 題目一 LeetCode 461.明距離(Hamming Distance) 兩個整數之間的漢明距離指的是這兩個數字對應二進制位不同的位置的數目。給出兩個整數 x 和 y,計算它們之間的漢