Объяснение и сравнение функции для подсчета / суммирования битов - PullRequest
1 голос
/ 16 апреля 2020

Я смотрю на эти функции, найденные над net для вычисления суммы установленных битов в int32:

Function countSB(ByVal x As Integer) As Integer
    x = (x And &H55555555) + (x >> 1 And &H55555555)
    x = (x And &H33333333) + (x >> 2 And &H33333333)
    x = (x And &HF0F0F0F) + (x >> 4 And &HF0F0F0F)
    x = (x And &HFF00FF) + (x >> 8 And &HFF00FF)
    x = (x And &HFFFF) + (x >> 16 And &HFFFF)
    Return x
End Function

Function countSB(ByVal x As Integer) As Integer
    Dim w As Long = x
    w -= (&HAAAAAAAA And w) >> 1
    w = (w And &H33333333) + (w >> 2 And &H33333333)
    w = w + (w >> 4) And &HF0F0F0F
    w += w >> 8
    w += w >> 16
    Return CInt(w And &HFF)
End Function

Я понимаю, как работает первая версия (которая кажется более понятной), суммируя сначала отдельные биты, затем пары битов и т. д. до двух частей по 16 бит каждая с использованием различных масок: 01010101010101010101010101010101 ... 00000000000000001111111111111111.

Не могли бы вы объяснить, в простых терминах, что второе каждый делает по-другому от первого. А если есть какое-то преимущество одного над другим?

...