Как эта битовая манипуляция работает в Java?

.
Я имел в виду что-то вроде этого (что я считаю правильным):

public static int bitCount(int number){  
        final int MASK = 0x1;  
        int count = 0;  

        for(int i = 0; i < 32; i++){  
            if(((number >>> i) & MASK) == MASK){  
                count++;  
            }  
        }  
        return count;  
    }  

Вместо этого я нашел метод, который я абсолютно не понимаю, что делает (мне кажется магией):

 i = i - ((i >>> 1) & 0x55555555);  
 i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);  
 i = (i + (i >>> 4)) & 0x0f0f0f0f;  
 i = i + (i >>> 8);  
 i = i + (i >>> 16);  
 return i & 0x3f;  

Может ли кто-нибудь помочь понять, что это так, и почему простая функция, подобная той, о которой я впервые подумал, может быть/плохой?

8
задан Cratylus 3 June 2012 в 21:15
поделиться