漢明距離的NEON版本

2021-09-10 09:57:30 字數 1593 閱讀 9671

****chromium中的libyuv。

// 256 bits at a time

// uses short accumulator which restricts count to 131 kb

uint32_t hammingdistance_neon(const uint8_t* src_a,

const uint8_t* src_b,

int count) , [%0]! \n"

// 從src_b load 256個bit到q2, q3中,src_b自加256

"vld1.8 , [%1]! \n"

// q0和q2異或的結果存到q0中

"veor.32 q0, q0, q2 \n"

// q1和q3異或的結果存到q1中

"veor.32 q1, q1, q3 \n"

// 統計q0中為1的位數,存到q0中

"vcnt.i8 q0, q0 \n"

// 統計q1中為1的位數,存到q1中

"vcnt.i8 q1, q1 \n"

// count自減32(一次計算了256個bit = 32 byte)

"subs %2, %2, #32 \n"

// 把q0和q1的為1的位數相加(16個計數)

"vadd.u8 q0, q0, q1 \n" // 16 byte counts

// 把q0中每兩相鄰的8位相加得到8個計數,再和q4中已有的計數相加

"vpadal.u8 q4, q0 \n" // 8 shorts

// count > 0 繼續迴圈

"bgt 1b \n"

// 把q4中每兩相鄰的16位相加並存到32位長度中,得到4個int

"vpaddl.u16 q0, q4 \n" // 4 ints

// q0 = ,把d0和d1中每兩相鄰的32位相加(兩個int)

"vpadd.u32 d0, d0, d1 \n"

把d0中兩相鄰的32位相加(得到乙個int結果)

"vpadd.u32 d0, d0, d0 \n"

// diff = d0的第0個int

"vmov.32 %3, d0[0] \n"

: "+r"(src_a), "+r"(src_b), "+r"(count), "=r"(diff)

:: "cc", "q0", "q1", "q2", "q3", "q4");

return diff;

}

Hamming Distance 漢明距離

在資訊理論中,hamming distance 表示兩個等長字串在對應位置上不同字元的數目,我們以d x,y 表示字串x和y之間的漢明距離。從另外乙個方面看,漢明距離度量了通過替換字元的方式將字串x變成y所需要的最小的替換次數。舉例說明以下字串間的漢明距離為 karolin and kathrin ...

漢明距離總和

題目 兩個證書的漢明距離指的是這兩個數字的二進位制數對應值不同的數量。計算乙個陣列中,任意兩個數之間漢明距離的總和。示例 輸入 4,14,2 輸出 6 解釋 在二進位制表示中,4表示為0100,14表示為1110,2表示為0010。這樣表示是為了提現後四位之間的關係 所以答案為 hammingdis...

Hamming Distance漢明距離

漢明距離是使用在資料傳輸差錯控制編碼裡面的,漢明距離是乙個概念,它表示兩個 相同長度 字對應位不同的數量,我們以d x,y 表示兩個字x,y之間的漢明距離。對兩個字串進行異或運算,並統計結果為1的個數,那麼這個數就是漢明距離。在資訊理論中,兩個等長字串之間的漢明距離是兩個字串對應位置的不同字元的個數...