Profil de xiong共享空间标题PhotosBlogListes Outils Aide
19 mars

谈论Ones Counting Algorithms

 

引用

Ones Counting Algorithms
  终于弄明白了一个巨ft无比的算法,聊以为记:
  static UInt32 count_ones(UInt32 n)
  {
    n = (n & 0x55555555) + ((n & 0xaaaaaaaa) >> 1);
    n = (n & 0x33333333) + ((n & 0xcccccccc) >> 2);
    n = (n & 0x0f0f0f0f) + ((n & 0xf0f0f0f0) >> 4);
    n = (n & 0x00ff00ff) + ((n & 0xff00ff00) >> 8);
    n = (n & 0x0000ffff) + ((n & 0xffff0000) >> 16);
    return n;
  }
 
  另外一个更bt的,还是看不懂:(.
  unsigned int ones32(register unsigned int x)
 {
        /* 32-bit recursive reduction using SWAR...
            but first step is mapping 2-bit values
            into sum of 2 1-bit values in sneaky way
        */
        x -= ((x >> 1) & 0x55555555);
        x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
        x = (((x >> 4) + x) & 0x0f0f0f0f);
        x += (x >> 8);
        x += (x >> 16);
        return (x & 0x0000003f);
 }

 
 
=====下面是熊力的注释======
 
第一个算法的目的是计算出32位整形数字的二进制表示中有多少个一。最普通的算法是32次移位。这里给出的算法只需要做log2(32),也就是5次移位就可以了。
 
算法思想是递归。思路是,首先把32位分割到32个盒子里面去,每个盒子一个数字,然后计算相邻两个盒子中有多少个一。然后相邻盒子之间合并,最后形成一个盒子。
 
第一次分割当然使用01010101
第二次就是001100110011
......
 
第二个算法,的思路跟第一个一模一样。只是每次合并和计算用的方法不同。第一个是移位,取掩码,相加。第二个计算前面可能会有溢出的时候用移位,取掩码,相减,到后面不可能溢出的时候直接移位相加。到了return的时候,由于32位数最多有0x20个1(10位二进制),所以取10位个1作为掩码,就是0x3f
 
第二个算法在后面不可能溢出的时候省略了取掩码的过程,性能会更好。第一种算法非常容易理解
 
 
谢谢nickol:
0x3f是6个1,不是10个1,哈哈~

Commentaires (5)

Veuillez patienter...
Le commentaire entré est trop long. Raccourcissez-le.
Vous n'avez rien entré. Réessayez.
Il est actuellement impossible d'ajouter votre commentaire. Réessayez plus tard.
Pour ajouter un commentaire, tu dois avoir l'autorisation de tes parents. Demander l'autorisation
Tes parents ont désactivé les commentaires.
Il est actuellement impossible de supprimer votre commentaire. Réessayez plus tard.
Vous avez dépassé le nombre maximal de commentaires qu'il est possible d'envoyer le même jour. Réessayez dans 24 heures.
Votre compte a pu laisser les commentaires désactivés parce que nos systèmes indiquent que vous risquez d'arroser d'autres utilisateurs de messages. Si vous pensez que votre compte a été désactivé par erreur, contactez l'assistance en ligne de Windows Live.
Effectuez la vérification de sécurité ci-dessous pour finaliser l'envoi de votre commentaire.
Les caractères entrés pour la vérification de sécurité doivent correspondre à ceux de l'image ou du fichier audio.

Pour ajouter un commentaire, connectez-vous avec votre identifiant Windows Live ID (si vous utilisez Messenger ou Xbox LIVE, vous avez un identifiant Windows Live ID). Connectez-vous


Vous n'avez pas d'identifiant Windows Live ID ? Inscrivez-vous

8 Sept.
Aucun noma écrit :
wow gold!All wow gold US Server 24.99$/1000G on sell! Cheap wow gold,wow gold,wow gold,Buy Cheapest/Safe/Fast WoW US EU wow gold Power leveling wow gold from the time you World of Warcraft gold ordered! wow power leveling wow power leveling power leveling wow power leveling wow powerleveling wow power levelingcheap wow power leveling wow power leveling buy wow power leveling wow power leveling buy power leveling wow power leveling cheap power leveling wow power leveling wow power leveling wow power leveling wow powerleveling wow power leveling power leveling wow power leveling wow powerleveling wow power leveling buy rolex cheap rolex wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling -317977561451737
21 Juin
17 Jan.
方枪枪a écrit :
幸亏不是你做的CASE,严重同情ing……
20 Mar.
Image de Anonyme
nickol a écrit :
第二个算法好难懂啊。。费了半天劲。。
 
另外纠正一个错误:0x3f是6个1,不是10个1,哈哈~
19 Mar.

Rétroliens

L'URL de rétrolien de ce billet est :
http://eparg.spaces.live.com/blog/cns!59BFC22C0E7E1A76!615.trak
Blogs Web qui font référence à ce billet
  • Aucune