@@ -70,38 +70,27 @@ size_t vector1BitSerializeToBlob(
7070 return (pVector -> dims + 7 ) / 8 ;
7171}
7272
73- // [sum(map(int, bin(i)[2:])) for i in range(256)]
74- static int BitsCount [256 ] = {
75- 0 , 1 , 1 , 2 , 1 , 2 , 2 , 3 , 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 ,
76- 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 ,
77- 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 ,
78- 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 ,
79- 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 ,
80- 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 ,
81- 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 ,
82- 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 ,
83- 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 ,
84- 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 ,
85- 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 ,
86- 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 ,
87- 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 ,
88- 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 ,
89- 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 ,
90- 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 , 5 , 6 , 6 , 7 , 6 , 7 , 7 , 8 ,
91- };
92-
9373int vector1BitDistanceHamming (const Vector * v1 , const Vector * v2 ){
9474 int diff = 0 ;
95- u8 * e1 = v1 -> data ;
96- u8 * e2 = v2 -> data ;
97- int i ;
75+ u8 * e1U8 = v1 -> data ;
76+ u32 * e1U32 = v1 -> data ;
77+ u8 * e2U8 = v2 -> data ;
78+ u32 * e2U32 = v2 -> data ;
79+ int i , len8 , len32 , offset8 ;
9880
9981 assert ( v1 -> dims == v2 -> dims );
10082 assert ( v1 -> type == VECTOR_TYPE_1BIT );
10183 assert ( v2 -> type == VECTOR_TYPE_1BIT );
10284
103- for (i = 0 ; i < v1 -> dims ; i += 8 ){
104- diff += BitsCount [e1 [i /8 ] ^ e2 [i /8 ]];
85+ len8 = (v1 -> dims + 7 ) / 8 ;
86+ len32 = v1 -> dims / 32 ;
87+ offset8 = len32 * 4 ;
88+
89+ for (i = 0 ; i < len32 ; i ++ ){
90+ diff += sqlite3PopCount32 (e1U32 [i ] ^ e2U32 [i ]);
91+ }
92+ for (i = offset8 ; i < len8 ; i ++ ){
93+ diff += sqlite3PopCount32 (e1U8 [i ] ^ e2U8 [i ]);
10594 }
10695 return diff ;
10796}
0 commit comments