Counting the number of leading zeros in a 128-bit integer

后端 未结 3 852
日久生厌
日久生厌 2021-01-06 03:40

How can I count the number of leading zeros in a 128-bit integer (uint128_t) efficiently?

I know GCC\'s built-in functions:

  • __builti
3条回答
  •  暖寄归人
    2021-01-06 04:41

    Yakk's answer works well for all kinds of targets as long as gcc supports 128 bit integers for the target. However, note that on the x86-64 platform, with an Intel Haswell processor or newer, there is a more efficient solution:

    #include 
    #include 
    // tested with compiler options: gcc -O3 -Wall -m64  -mlzcnt
    
    inline int lzcnt_u128 (unsigned __int128 u) {
      uint64_t hi = u>>64;
      uint64_t lo = u;
      lo = (hi == 0) ? lo : -1ULL;
      return _lzcnt_u64(hi) + _lzcnt_u64(lo);
    }
    

    The _lzcnt_u64 intrinsic compiles (gcc 5.4) to the lzcnt instruction, which is well defined for a zero input (it returns 64), in contrary to gcc's __builtin_clzll(). The ternary operator compiles to the cmove instruction.

提交回复
热议问题