Я смотрю на эти функции, найденные над 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.
Не могли бы вы объяснить, в простых терминах, что второе каждый делает по-другому от первого. А если есть какое-то преимущество одного над другим?