variable-precision SWAR算法介绍

简介: variable-precision SWAR算法介绍

BITCOUNT命令是统计一个位数组中非0进制位的数量,数学上称作:"Hanmming Weight"


目前效率最好的为variable-precision SWAR算法,可以常数时间内计算出多个字节的非0数目,算法设计的非常精巧,值得学习。


int swar(uint32_t i)
{
    // (A)
    i = ( i & 0x55555555) + ((i >> 1) & 0x55555555);
    // (B)
    i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
    // (C)
    i = (i & 0x0F0F0F0F) + ((i >> 4) & 0x0F0F0F0F);
    // (D)
    i = (i * 0x01010101) >> 24);
    return i;
}


原理解释:

(A) 0x55555555  二进制为:  0101 0101 0101 0101  0101 0101 0101 0101, 奇位为1, 偶数为0

  如果按照i的二进制表示  b31 b30.......  b7 b6 b5 b4 b3 b2 b1 b0    

    i & 0x55555555  则取出全部的奇数位:         0  b30 ...... 0  b6 0 b4 0 b2 0 b0

    (i >> 1) & 0x55555555 则取出偶数位:        0 b31        0  b7  0 b5 0 b3 0 b1

  两者相加:                                        + ------------------------------------------

                                                                    0  (b30+b31)     .....         0   (b6+b7)   0   (b4+b5)   0   (b2+b3)    0   (b0+b1)

原理就是按照二进制2位一个分割,计算该两位的1的数目

 

(B) 将 (A)步骤按照二进制2位划分的1的数目按照4个bit位进行累加

(C) 将  (B)步骤中1的数目按照8个bit位进行累加

(D)  (C)步骤中已经计算出了8bit划分的2进制的数目

      如     byte3  byte2 byte1  byte0

     y  =    y3      y2      y1      y0

      那么 y * 0x01010101 则实现了 将 y0 y1 y2位和y3位置的累加 则y的值为:

                      byte3            byte2        byte1    byte0

   yn  =     y3+y2+y1+y0        x2             x1         x0    将yn >> 24位 则得到了  y3+y2+y1+y0 的效果。

目录
相关文章
|
10月前
一张图深入的理解FP/FN/Precision/Recall
一张图深入的理解FP/FN/Precision/Recall
68 0
|
11月前
|
算法
单变量与多变量线性回归(Linear Regression with One Variable)
它被称作监督学习是因为对于每个数据来说,我们给出了“正确的答案”,即告诉我们:根据我们的数据来说,房子实际的价格是多少,这是一个回归问题。回归指的是,我们根据之前的数据预测出一个准确的输出值,对于这个例子就是价格,同时,还有另一种最常见的监督学习方式,叫做分类问题,当我们想要预测离散的输出值,例如,我们正在寻找癌症肿瘤,并想要确定肿瘤是良性的还是恶性的,这就是0/1离散输出的问题。
117 0
单变量与多变量线性回归(Linear Regression with One Variable)
【sklearn报错解决方案】UndefinedMetricWarning: Precision is ill-defined and being set to 0.0
【sklearn报错解决方案】UndefinedMetricWarning: Precision is ill-defined and being set to 0.0
989 0
【sklearn报错解决方案】UndefinedMetricWarning: Precision is ill-defined and being set to 0.0
|
机器学习/深度学习 PyTorch 算法框架/工具
解决Pytorch中RuntimeError: expected scalar type Double but found Float
解决Pytorch中RuntimeError: expected scalar type Double but found Float
2419 0
(2)tf.Variable中trainable作用
如果为True,则会默认将变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES中。此集合用于优化器Optimizer类优化的的默认变量列表,如果为False则在训练时不会更新该值。
111 0
|
机器学习/深度学习 自然语言处理 Python
Word2Vec教程-Negative Sampling 负采样
这篇word2vec教程2中(教程1 Word2Vec教程-Skip-Gram模型),作者主要讲述了skip-gram 模型优化的策略-Negative Sampling,使得模型更加快速地训练。通过教程1,我们了解到word2vec它是一个庞大的神经忘网络! 例如,有一个包含10000个单词的词汇表,向量特征为300维,我们记得这个神经网络将会有两个weights矩阵----一个隐藏层和一个输出层。这两层都会有一个300x10000=3000000的weight矩阵。 在如此大的神经网络上进行梯度下降是非常慢的,更加严重的是,我们需要大量训练数据去调整weights和避免over-fitti
598 0
Word2Vec教程-Negative Sampling 负采样
|
机器学习/深度学习 TensorFlow 算法框架/工具
TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable
TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable
TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable
|
机器学习/深度学习 资源调度 算法
|
TensorFlow 算法框架/工具