C# 对计数/求和位函数的解释和比较

C# 对计数/求和位函数的解释和比较,c#,vb.net,hex,bitwise-operators,bit-shift,C#,Vb.net,Hex,Bitwise Operators,Bit Shift,我正在查看这些通过网络找到的函数,以计算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

我正在查看这些通过网络找到的函数,以计算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 ... 0000000000000000 1111111111

请你简单地解释一下,第二个和第一个有什么不同。如果一个比另一个有什么优势呢