VPP程式碼閱讀中文註解--bitops.h
阿新 • • 發佈:2018-11-07
/* Population count from Hacker's Delight. */ always_inline uword count_set_bits (uword x) { #ifdef __POPCNT__ #if uword_bits == 64 return __builtin_popcountll (x); #else return __builtin_popcount (x); #endif #else #if uword_bits == 64 const uword c1 = 0x5555555555555555; const uword c2 = 0x3333333333333333; const uword c3 = 0x0f0f0f0f0f0f0f0f; #else const uword c1 = 0x55555555; const uword c2 = 0x33333333; const uword c3 = 0x0f0f0f0f; #endif /* Sum 1 bit at a time. */ x = x - ((x >> (uword) 1) & c1); /* 2 bits at a time. */ x = (x & c2) + ((x >> (uword) 2) & c2); /* 4 bits at a time. */ x = (x + (x >> (uword) 4)) & c3; /* 8, 16, 32 bits at a time. */ x = x + (x >> (uword) 8); x = x + (x >> (uword) 16); #if uword_bits == 64 x = x + (x >> (uword) 32); #endif return x & (2 * BITS (uword) - 1); #endif }
計算1個字長記憶體裡置1的bit數目。 在編譯器沒有內建支援的時候,使用了Hacker's Delight演算法,這個演算法以後詳述。