并行bit count算法

ORB-SLAM3 DescriptorDistance 是 ORB-SLAM3 中用于的核心函数。 阅读详情

计算一个整型数字中有多少个bit被置1,一般会想到按位循环遍历的方法。

这里有一个并行计算的方法如下:

先上代码

v = v - ((v >> 1) & 0x55555555);                    // reuse input as temporary
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);     // temp
c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count

就这3步,只有12个operation,
它采用了分治法思想并行计算,

第一行计算了相邻2位的bit和,相邻2位的意思是32bit的数中把bit两两分组,计算每组的bit和,
可以看到0x555是一个magic number,
0x55555555 = 01010101 01010101 01010101 01010101

第一行代码的效果:
首先右移一位,把高位的数给了低位,然后0x55555555是掩码,把高位置0,得到了新的2位数,再用原来的数减去刚刚得到新的两位数,得到想要的结果:

00b >> shifted: ?0b >> masked: 00b >> subtraction: 00b - 00b >> 00b
01b >> shifted: ?0b >> masked: 00b >> subtraction: 01b - 00b >> 01b
10b >> shifted: ?1b >> masked: 01b >> subtraction: 10b - 01b >> 01b
11b >> shifted: ?1b >> masked: 01b >> subtraction: 11b - 01b >> 10b

可以看到得到了相邻2位的bit数。

相邻2位的算出来以后,再进入更大的组,相邻4位,就是4个一组,计算每组的bit数,
而我们看到,4个一组中的2小组都是刚才已经计算好了的。
所以这4个一组中要计算的是里面两个小组的和(刚才相邻两位计算出来的是每两位的bit数,它们相加就是相邻4位的bit数)。

既然是相邻4位,换一个magic number
0x33333333 = 00110011 00110011 00110011 00110011

第2行代码计算的是相邻4位的bit数,效果如下:

要计算的是1010b中相邻的两小组10b和10b的和,应该是10b + 10b = 100b
(注意10b是上一行代码算的相邻2位的bit和)

1010b   ---->>-----   0010b
0011b                 0011b
----&----           ----&----
0010b                 0010b
-------------+---------------
           0100b

第3行代码就是进入更大的组,相邻8位的和,思路和上面一样,这回的magic number是
0x0000FFFF = 00000000 00000000 11111111 11111111

第3行(v + (v >> 4) & 0xF0F0F0F)的效果就是计算出相邻8位(8位一组)的bit数

然后32bit的数字可以分为4个8位(A B C D)
最后要求A,B,C,D这4个组的bit数之和,

最后用了bit乘法,* 0x1010101
bit乘法的计算法则如下,和十进制数乘法一样的
在这里插入图片描述
所以最后(A B C D) * 0x1010101的结果是(A+B+C+D, B+C+D, C+D, D),
右移24位就是我们要的A+B+C+D.

参考链接

MySQL函数:`BIT_COUNT()`计算一个数的二进制表示中 `1` 的个数。 我们深入探讨了 MySQL 中的函数,了解了其基本用法、内部实现、应用场景以及性能考量。函数是一个简单而强大的工具,可以在数据压缩、奇偶校验、权限控制和算法优化等领域发挥重要作用。记住在使用它时要考虑数据类型、NULL 值处理以及性能优化, 尤其要注意负数的处理方式。 阅读详情

相关推荐

使用光流进行 Warp 的流程

光流描述了图像帧中每个像素的运动。前向光流:描述了帧中每个像素在帧中的移动位置。后向光流:描述了帧中每个像素在帧​ 中的移动位置。水平方向的位移(x 方向),即每个像素水平移动了多少像素。垂直方向的位移(y 方向),即每个像素垂直移动了多少像素。使用光流进行 Warp 的流程Warp 是通过光流对图像进行变换的操作,旨在将前一帧的像素根据光流场映射到下一帧的对应位置。Step 1: 计算光流我们首先需要通过光流网络(如 RAFT)来估算两帧之间的光流。我们可以获得前向光流(从帧​ 到帧。

qq_44199605的博客 2108

统计单字节、多字节bit位长度

#include //统计一个字节bit为1的个数 unsigned char CountBit(unsigned char value) { unsigned char i=0; unsigned char count=0; while(i<8) { if(value & 0x01) { count++; } value>>=1; i++; } retur

何文斌的专栏 1269

S-function入门及案例详解(1)——S-function基础介绍及基本案例

本专题将用三篇文章对S-function进行介绍及其案例详解。欢迎关注~ 目录一、S-Function简介二、详解sfuntmpl函数2.1 sfuntmpl函数介绍2.2 mdlInitializeSizes函数2.3 mdlDerivatives函数2.4 mdlUpdate函数2.5 mdlOutputs函数2.6 mdlGetTimeOfNextVarHit函数2.7 mdlTerminate函数三、案例1——对波形的幅值进行放大3.1 案例分析3.2 案例详解3.3 输出波形四、案例2——对波形的

Wendy的博客 7万+

Count bit

#include &lt;stdio.h&gt; int count_bit1(int num) { int count = 0; while (num &gt; 0) { num &amp;= (num - 1); count++; } return count; } int count_bit2(unsigned int num) { uns...

yangjingxu的专栏 425

LabVIEW实现HTTP通信

本节简要介绍HTTP通信的基础知识,并以工业物联网平台TLINK中云端设备的数据发布设计为例,阐述互联网环境下HTTP客户端应用程序设计的基本方法。重点讲解工业物联网平台TLINK中HTTP设备的创建、通信数据帧的构造与测试。

不脱发的程序猿 1543

【华为OD机试真题E卷】514、学生方阵 | 机试真题+思路参考+代码分析(E卷复用)(C++、Java、Py)

【华为OD机试真题E卷】514、学生方阵 | 机试真题+思路参考+代码分析(E卷复用)(C++、Java、Py) 题目描述 学校组织活动,将学生排成一个矩形方阵 请在矩形方阵中找到最大的位置相连的男生数量 这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的 注:学生个数不会超过10000

KJ.JK 2492

bitCount-计算数字二进制中1的个数

这里写自定义目录标题1. 题目描述2. 解决方法3. bitcount解法分析4. 参考 主要介绍bitcount位运算实现,思路和java中bitcount的实现一样。 1. 题目描述 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。 LeetCode 2. 解决方法 解法1 第一反应就是直接暴力,代码如下: int hammingWeight(uint32_t n) { int ret = 0; for

dopamine_joker的博客 7224

Apollo 9.0 速度非线性规划算法 – piecewise jerk speed nonlinear optimizer Ⅰ

二次规划的速度规划算法(PiecewiseJerkSpeedOptimizer)的存在两个问题: 这里以一张图来说明上面的问题,假设存在一个实际限速区间(或曲率很大需要降速的区间)[S1, S2],PiecewiseJerkSpeedOptimizer的做法是根据动态规划的st曲线(黑色),找到具体的时间区间[T1, T2],然后对区间[T1, T2]内所有的点施加约束或惩罚。但是二次规划平滑后的曲线(黄色)发生了变化,那么限速区间[S1, S2]对应的时间区间[T1, T2]也发生了变化,所以实际应该是对

WaiNgai 331

深入理解bit_or和bit_and,bit_count

bit_or:二进制数按位或,bit_and:二进制数按位与,bit_count:统计二进制数1个个数下面以一个例子来说明用法:示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里。1234567-- 创建表CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,             day INT(2) UNSIGN...

峰之流觞的博客 1万+

YOLOv8-COCO指标转换

本文介绍了将YOLO格式数据集转换为COCO格式并评估模型性能的完整流程。首先需将YOLO格式的标注数据转换为COCO格式,通过修改classes、image_path等参数适配不同数据集。然后使用YOLO模型对验证集进行预测并保存结果为JSON格式。最后通过比较预测结果和转换后的COCO标注文件,使用COCO官方评估指标和TIDE工具进行性能分析,生成包含AP、AR等指标的报告及错误分析图表。整个过程实现了从数据准备到模型评估的完整闭环,为计算机视觉任务提供标准化的性能评估方案。

FJN110的博客 401

YOLOv11在视频流中的时序建模改进-(加入ConvLSTM或Transformer捕捉帧间关联)

本文提出了一种结合ConvLSTM和Transformer的改进YOLOv11算法,用于增强视频目标检测的时序建模能力。针对视频检测中运动模糊、遮挡等挑战,研究分析了ConvLSTM的局部时空特征建模和Transformer的全局注意力机制之间的互补性。通过数学公式详细阐述了ConvLSTM的门控机制和Transformer的自注意力计算原理,并提出分层融合策略:底层使用ConvLSTM处理高分辨率特征捕捉局部运动,高层应用Transformer建立全局时空关联。改进方案在YOLOv11架构中插入时序增强模

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 678

懂二进制

世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么? 输入例子: 1999 2299输出例子: 7class Solution { public: /** * 获得两个整形二进制表达位数不同的数量 * * @param m 整数m * @param n 整数n * @

Sunburst的专栏 1326

RK3568_Android15适配以太网网卡gmac+国产phy芯片YT8531

本文介绍了在Android15 SDK上适配正点原子ATK-DLRK3568开发板网卡的过程。开发板采用GMAC接口搭配YT8531C PHY芯片,包含两个千兆网口。主要内容包括:硬件原理图确认、网络链路连接方式、内核DTS配置(包括GMAC0和GMAC1的参数设置)、PHY驱动适配(基于motorcomm.c驱动文件)、PHY寄存器读写调试方法以及MAC地址设置方式。文章还分析了常见问题,如网卡注册后无法ping通网络的故障现象。通过详细的硬件确认和软件配置,实现了双网卡在Android系统上的完整适配。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2013

C++ std::bitset 详解:内存省8倍、运算快18倍的位级并行

在C++高性能开发中,数据结构和存储方式往往决定了程序的最终性能。传统布尔数组每个元素占据一个完整字节,而位集通过位压缩将存储开销缩小到八分之一。其核心原理是位级并行:将多个布尔值打包进一个字块,通过一条CPU指令同时处理多个独立逻辑位,从而大幅提升吞吐。在批量赋值、按位与合并、查找首个置位等高频场景中,这一特性可带来数量级的性能提升。除了节省内存,std::bitset在去重、组合筛选、状态机标记等实际工程中也有广泛应用。当需要固定大小的稠密位集合时,std::bitset是C++开发者值得重视的性能利器

weixin_33326218的博客 290

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Brian Kernighan算法:二进制数中1的高效统计方法

位操作是计算机科学中的基础技术,通过直接操作二进制位实现高效计算。Brian Kernighan算法利用n & (n-1)操作消除最右边的1,将统计1的个数的时间复杂度优化为O(k),其中k为1的个数。这种算法在哈希表优化、图像处理等场景中表现优异,相比传统方法可提升数倍性能。现代编程语言如Python和Java已内置类似优化函数,但在特定场景下理解算法原理仍有助于进一步优化。

weixin_32667955的博客 290

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

mysql bitcount,mysql中bit_count和bit_or使用

在看参考手册的时候看到个案例3.6.8 Calculating Visits Per Daycreate table t1(year YEAR(4), month INT(2) UNSIGNED ZEROFILL, day INT(2) UNSIGNED ZEROFILL);insert into t1 values(2000,1,1),(2000,1,20),(2000,1,30),(2000,...

weixin_42157567的博客 506

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

[转] fast bit count

不得不转,这个太经典了。后面两个问题自己分析了一下。 转自:http://blog.chinaunix.net/u/13991/showart_115947.html 代码:http://infolab.stanford.edu/~manku/bitcount/bitcount.c   Fast Bit Counting Routines Compiled from various ...

idning 189

基于CUDA的FCBO算法的并行实现(概念格的并行构造)

将原FCBO算法计算新的形式概念的函数,即Compute Closure函数并行化。但是由于CPU与GPU的数据交换开销太大,并行化没有带来加速效果。 fcbo.h文件 //fcbo.h文件,包括串行fcbo算法所需的函数与变量 //在Visual Studio 2015编译通过 #pragma once #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <st

liuqi_67676767的博客 1017

BIT_COUNT()&BIT_OR()

在学习MySQL手册时,看到根据天数计算访问量时,出现了BIT_COUNT()和BIT_OR()两个函数来处理天数计算的问题所使用的表格信息如下:mysql> select year,month,day from t1;+------+-------+------+| year | month | day |+------+-------+------+| 2000 ...

weixin_34380781的博客 74

python3.10新特性 match-case,bit_count,以及3.9的cache装饰器

在记忆化搜索中,程序会记录下已经计算过的结果,然后在后续的计算中,如果需要再次计算相同的问题,就直接返回之前保存的结果,而不是重新计算。这样就能够避免重复计算,提高程序的执行效率。在之前的版本中,python实际上并没有提供这样的方法,要实现这样的功能往往需要用一连串的if... elif... elif... elif...,(真的很痛苦)在旧版本的 lru_cache 中,在默认情况下对缓存队列有大小的限制,默认maxsize=128,当缓存队列已满时,将缓存使用次数最少的元素。

weixin_43843699的博客 927

bit count in c (1)

=============================运行结果 4296000 -&gt; 10000011000110101000000   a1_bitcount: num of 1=7, time=782 ms   a2_bitcount: num of 1=7, time=265 ms   a3_bitcount: num of 1=7, time=938 ms   a4a_...

fish@sea 244

校招算法笔面试 | 校招笔面试真题-bit count

牛客题库题解牛客题库题解

wc529065的博客 887

七种bit count快速计算方法比较

转自:http://blog.chinaunix.net/u/13991/showart_115947.html http://idning.iteye.com/blog/732769 代码:http://infolab.stanford.edu/~manku/bitcount/bitcount.c   Fast Bit Counting Routines Compiled

一地鸡毛 4392

Adjacent Bit Count+SPOJ+dp题

Adjacent Bit Counts Problem code: GNYR09F For a string of n bits x1,x2,x3,...,Xn the adjacent bit count of the string (AdjBC(x)) is given by X1*X2 + X2*X3 + X3*X4 + ... + Xn-1

u012870383的专栏 632

Bit Vector算法

摘要: 该算法常用到包分类中,初次接触到bit vector算法是在对海量数据的处理。 设想我们有个很大的数据集,它的总体个数为400亿个数字,需要消除重复的数据,一种想当然的做法是,每次读取一部分,进行消重,如每次读取1000万个数据进行消重,这样我们就可以将40亿个数字分成400部分,将消重后的数据合并,然后进行进一步消重,这种做法显然需要的花费很大的时间开销。假设将所有数据都读取到内存中,发...

qq_25956141的博客 6936

位计算(Bit Count)

<br />写的很详细!<br />http://teprince.spaces.live.com/blog/cns!d3cebe39db4e77c9!363.entry<br />http://infolab.stanford.edu/~manku/bitcount/bitcount.html

wjling2009的专栏 987
上一篇: leetcode 47. Permutations II(排列II)
下一篇: leetcode 1302. Deepest Leaves Sum(叶子节点的和)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值