这个bitset :: count()的实现如何工作?

lez*_*lon 5 c c++ stl

以下是std::bitset::countMSVC 2010 的实现:

size_t count() const
    {   // count number of set bits
    static char _Bitsperhex[] = "\0\1\1\2\1\2\2\3\1\2\2\3\2\3\3\4";
    size_t _Val = 0;
    for (int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
        for (_Ty _Wordval = _Array[_Wpos]; _Wordval != 0; _Wordval >>= 4)
            _Val += _Bitsperhex[_Wordval & 0xF];
    return (_Val);
    }
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这是如何工作的吗?诀窍是_Bitsperhex什么?

Wug*_*Wug 9

_Bitsperhex 包含十六进制数字中的设置位数,由数字索引.

digit: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
value: 0    1    1    2    1    2    2    3    1    2    2    3    2    3    3    4
index: 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
Run Code Online (Sandbox Code Playgroud)

该函数通过与0xF(二进制1111)进行AND运算,从它所使用的值一次检索一个数字,查找该数字中的设置位数,并对它们求和.

  • @lezebulon,内部循环实际上非常聪明 - 它依赖于右移一次删除4位,并且一旦没有位,循环就会退出.如果初始值为零,则循环甚至不运行. (2认同)