首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

给定unsigned int,获取set位的"索引"的最快方法是什么?

在C++中,获取无符号整数的第n个set位的索引的最快方法是使用位操作。具体来说,可以使用以下代码:

代码语言:c++
复制
unsigned int get_nth_set_bit_index(unsigned int x, int n) {
    unsigned int mask = 1;
    int count = 0;
    for (int i = 0; i < 32; i++) {
        if ((x & mask) != 0) {
            count++;
            if (count == n) {
                return i;
            }
        }
        mask <<= 1;
    }
    return -1; // 如果n大于set位的数量,返回-1
}

这个函数接受一个无符号整数x和一个整数n,返回x中第n个set位的索引。如果n大于x中set位的数量,则返回-1。

该函数首先创建一个掩码,其中只有一个比特位为1。然后,它遍历整数的所有32个比特位,检查每个比特位是否为1。如果是,则增加计数器。如果计数器等于n,则返回当前比特位的索引。如果遍历完所有比特位,但计数器仍然小于n,则说明n大于x中set位的数量,返回-1。

这个函数的时间复杂度为O(32),即O(1)。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一文搞懂 | Linux pinctrlgpio子系统

pinctrl_ops中抽象出三个回调函数,用来获取pin groups相关信息,如下: struct pinctrl_ops { //获取系统中pin groups个数,后续操作,将以相应索引为单位...(类似数组下标,个数为数组大小) int (*get_groups_count) (struct pinctrl_dev *pctldev); //获取指定group(由索引selector指定...selector(index),获取指定pin groupname get_group_pins 给定一个selector(index),获取该pin group中pin信息(该pin group包括多少个...),获取指定functionname get_function_groups 给定一个selector(index),获取指定functionpin groups信息 set_mux 将指定pin...给定一个pin ID以及config type ID,获取该引脚上指定type配置 pin_config_set 设定一个指定pin配置 pin_config_dbg_show debug接口 pin_config_group_dbg_show

1.3K20

标准库类型

6、标准库不要求检查索引值,所有索引下标越界是没有定义,会导致严重错误。 1.3  string对象操作 ?    ...它定义为unsigned型(unsigned intunsigned long)具有相同含义,而且可以保证足够大能够存储任意string对象长度。     ...但是这里ivec是空vector对象,而且下标只能用于获取已存在元素。 这个循环正确写法应该是: 1 for(vector::size_type ix=0; ix!...1、用unsigned值初始化bitset对象:該值将转换成二进制模式,如果bitset类型长度打印unsigned long值二进制位数,其余高阶将置为0,而小于则只用unsigned值中低阶...1 bitset bitvec; // 32 bits , all zero 2 size_t bits_set = bitvec.count(); //置为1二进制个数 3 size_t

88180
  • c语言中用户自定义类型

    )) BITS_PER_WORD表示一个无符号整型数位数,宏I_WORD用于根据指定索引来计算存放相应比特字,I_BIT用于计算访问这个字中相应比特要用掩码。...用户数据 在第一个版本中,我们使用显示调用来设置和获取值,如下所示: a = array.new(1000) for i = 1, 1000 do array.set(a,i,i % 2 == 0.../getarray新版本 static unsigned int *getparams (lua_State *L, unsigned int *mask){ BitArray *a = checkarray...其次,不要“完全”二字所迷惑,实际上完全用户数据开销也并不大。对于给定内存大小,完全用户数据与malloc相比值增加了一点开销。 轻量级用户数据真正用途是相等性判断。...在回调函数中,一旦有了流地址,就可以将其作为轻量级用户数据,把它当做这张表索引获取对应Lua对象(这张表很可能得事弱引用;否则,这些完全用户数据可能永远不会被作为垃圾回收)。

    1.2K30

    【内存管理】页表映射基础知识

    ARM32 虚拟地址到物理地址转换 虚拟地址32个bit可以分为3个域,最高12bit20~31称为L1索引,叫做PGD,页面目录。...中间8个bit叫做L2索引,在Linux内核中叫做PT,页表。最低12叫做页索引。 在ARM处理器中,TTBRx寄存器存放着页表基地址,我们这里一级页表有4096个页表项。...二级页表通常是动态分配,可以通过虚拟地址中间8bitL2索引访问二级页表,在L2索引中存放着最终物理地址高20bit,然后和虚拟地址低12bit就组成了最终物理地址。...最后通过L3页表项可以得到物理地址bit12 ~ 47,这个时候再将虚拟地址索引对应到物理地址0~11就是完整物理地址。...标志(三级页表才会用该标志) *set_pte_at() 把pte设置到硬件页表中 */ set_pte_at(mm, addr, pte, pte_mkspecial

    22910

    Redis 数据结构之字符串那些骚操作

    一个合理猜测就是可能 argv[2] 什么都没变就返回去了,也可能改了点什么东西返回去更新了自己。那要是什么都不变,就又可以少研究一个方法啦。 抱着这个侥幸心理,进入方法内部看看。...sds.h typedef char *sds; struct sdshdr { unsigned int len; unsigned int free; char buf[...struct sdshdr { unsigned int len; unsigned int free; char buf[]; }; 回过头来说这个 sds 结构,char...字符串底层数据结构 SDS 字符串底层数据结构是 SDS,简单动态字符串 struct sdshdr { unsigned int len; unsigned int free;...GETBIT key offset:对 key 所储存字符串值,获取指定偏移量上(bit)。 MGET key1 [key2..]:获取所有(一个或多个)给定 key 值。

    45930

    MySQL之库表操作详述

    ,最长128 查看数据库 注意:在cmd中输入指令是不区分大小写 show databases;  #这查看是所有的库 show create database db1;  #这是查看指定库...4.只会缓存索引             MyISAM可以通过key_buffer_size值来提高缓存索引,以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。        ...length(字段)  #查看该字段数据字节长度 char——length(字段)  #查看该字段数据字符长度   3.5,枚举类型enum和集合类型set enum:单选,只能在给定范围内选一个值...set:多选,可以在给定范围内选择一个或多个值  示例:   枚举     CREATE TABLE shirts (name VARCHAR(40),size ENUM('xsmall', 'small...; 这种方法只复制结构,没有数据,但所有的约束条件都复制了

    68610

    Reflector、reflexil、De4Dot、IL指令速查表

    And 计算两个值“与”并将结果推送到计算堆栈上。 Arglist 返回指向当前方法参数列表非托管指针。 Beq 如果两个值相等,则将控制转移到目标指令。...Stelem 用计算堆栈中值替换给定索引数组元素,其类型在指令中指定。 Stelem.I 用计算堆栈上 native int 值替换给定索引数组元素。...Stelem.I1 用计算堆栈上 int8 值替换给定索引数组元素。 Stelem.I2 用计算堆栈上 int16 值替换给定索引数组元素。...Stelem.I4 用计算堆栈上 int32 值替换给定索引数组元素。 Stelem.I8 用计算堆栈上 int64 值替换给定索引数组元素。...Stelem.R4 用计算堆栈上 float32 值替换给定索引数组元素。 Stelem.R8 用计算堆栈上 float64 值替换给定索引数组元素。

    1.8K50

    IL指令详细

    And 计算两个值“与”并将结果推送到计算堆栈上。 Arglist 返回指向当前方法参数列表非托管指针。 Beq 如果两个值相等,则将控制转移到目标指令。...Stelem 用计算堆栈中值替换给定索引数组元素,其类型在指令中指定。 Stelem.I 用计算堆栈上 native int 值替换给定索引数组元素。...Stelem.I1 用计算堆栈上 int8 值替换给定索引数组元素。 Stelem.I2 用计算堆栈上 int16 值替换给定索引数组元素。...Stelem.I4 用计算堆栈上 int32 值替换给定索引数组元素。 Stelem.I8 用计算堆栈上 int64 值替换给定索引数组元素。...Stelem.R4 用计算堆栈上 float32 值替换给定索引数组元素。 Stelem.R8 用计算堆栈上 float64 值替换给定索引数组元素。

    1.5K30

    IL指令速查

    And 计算两个值“与”并将结果推送到计算堆栈上。 Arglist 返回指向当前方法参数列表非托管指针。 Beq 如果两个值相等,则将控制转移到目标指令。...Stelem 用计算堆栈中值替换给定索引数组元素,其类型在指令中指定。 Stelem.I 用计算堆栈上 native int 值替换给定索引数组元素。...Stelem.I1 用计算堆栈上 int8 值替换给定索引数组元素。 Stelem.I2 用计算堆栈上 int16 值替换给定索引数组元素。...Stelem.I4 用计算堆栈上 int32 值替换给定索引数组元素。 Stelem.I8 用计算堆栈上 int64 值替换给定索引数组元素。...Stelem.R4 用计算堆栈上 float32 值替换给定索引数组元素。 Stelem.R8 用计算堆栈上 float64 值替换给定索引数组元素。

    1.6K70

    IL指令详细表

    And 计算两个值“与”并将结果推送到计算堆栈上。 Arglist 返回指向当前方法参数列表非托管指针。 Beq 如果两个值相等,则将控制转移到目标指令。...Stelem 用计算堆栈中值替换给定索引数组元素,其类型在指令中指定。 Stelem.I 用计算堆栈上 native int 值替换给定索引数组元素。...Stelem.I1 用计算堆栈上 int8 值替换给定索引数组元素。 Stelem.I2 用计算堆栈上 int16 值替换给定索引数组元素。...Stelem.I4 用计算堆栈上 int32 值替换给定索引数组元素。 Stelem.I8 用计算堆栈上 int64 值替换给定索引数组元素。...Stelem.R4 用计算堆栈上 float32 值替换给定索引数组元素。 Stelem.R8 用计算堆栈上 float64 值替换给定索引数组元素。

    2.1K20

    面试遇到 Redis,我作为小白是这么被“刁难”!|还可以学到什么(1)?

    数据结构普通类 ADT抽象,不一定是底层实现,c语言深陷太深,缘故, 遇到人工智能,其他岗位面试官你出问题了。你问清楚数据值是什么?不要自己想。 ? ?...unsigned lru:22; /* lru time (relative to server.lruclock) */ // 引用计数,用于内存回收 int refcount...前言:针对“附近的人”这一置服务领域应用场景,常见可使用PG、MySQL和MongoDB等多种DB空间索引进行实现。...地图分块过程其实就是一种添加索引过程,如果能想到一个办法,把地图上点添加一个合适索引,并且能够排序,那么就可以利用类似二分查找方法进行快速查询。...52 整数进行编码, 放进了 zset 里面, zset value 是元素 key, score 是 GeoHash 52 整数值 首先在每个geohash网格中geohash值都是连续

    49830

    《redis设计与实现》1-数据结构与对象篇

    redis底层使用了哪些数据结构支撑它如此高效性能? 内部丰富数据类型底层为什么都使用至少两种数据结构实现?分别是什么? 如果合理使用redis才能发挥它最大优势?...(*match)(void *ptr, void *key); // 节点值对比函数 unsigned long len; // 节点数量 } list; 复制代码 特点 双端队列,可以获取某个节点前置节点和后置节点...一个字节 6bit 63 01 字符数组 两个字节 14bit 2^14-1 10 字符数组 五个字节 4*8,第一个字节余下6bit留空 2^32-1 11 整数 1个字节 000000 int16..._t类型整数 11 整数 1个字节 010000 int32_t类型整数 11 整数 1个字节 100000 int64_t类型整数 11 整数 1个字节 110000 24有符号整数 11 整数 1...参考命令 # 设置字符串 set msg "hello world" rpush numbers 1 2 3 4 5 llen numbers lrange numbers 0 5 # 获取键值使用底层数据结构

    56760

    性能分析之单条SQL查询案例分析(mysql)

    ,该参数表示插入数据表 emp 数据条数 elimiter $$ create procedure insert_emp(in max_num int(10)) begin declare i int...) null(速度最快) possible_keys: 此次查询中可能选用索引 key: 此次查询中确切使用到索引 key_len:使用索引最大长度; ref: 哪个字段或常数与 key 一起被使用...index 中即可获取) using temporary(使用临时表) using where(如果包含 where,且不是仅通过索引即可获取内容,就会包含此信息) 这样,通过执行计划我们就可以清楚看到...然后我们通过以下命令获取系统中保存所有 Query profile 概要信息 ? 然后我们可以通过以下命令查看具体某一次查询 Profiling 信息 ?...在该日志文件中,我们可以知道慢查询产生时间,最终产生了几行结果,测试了几行结果,以及运行语句是什么。在这里我们可以看到,这条语句产生一个结果,但是检测了 1000w 行记录,是一个全表扫描语句。

    1K10

    操作运算有什么奇技淫巧?(附源码)

    return 1 << 31;//-2147483648 } mn次方 //自己重写pow()方法 int pow(int m , int n){ int sum = 1; while...return (n + 1) >> 1; } 二分查找32整数前导0个数 int nlz(unsigned x) { int n; if (x == 0) return(32);...将 x 第 n 位置1,可以通过 x |= (x << n) 来实现 set_bit(char x, int n); 将 x 第 n 清0,可以通过 x &= ~(1 << n) 来实现 clr_bit...,Brian Kernighan方式 使用64指令对14、24或32字中设置进行计数 并行设置计数位 从最高有效给定位置计数位设置(等级) 从给定计数(等级)中选择位置(从最高有效开始...为底整数 查找整数整数对数10 查找32IEEE浮点数整数对数基数2 查找32IEEE浮点pow(2,r)根整数对数基数2(对于无符号整数r) 计算连续尾随零(或查找索引) 线性计算右边连续零

    86841

    【驱动】串口驱动分析(三)-serial driver

    unsigned char unused1: 未使用成员变量。 unsigned int read_status_mask: 用于指定读取状态屏蔽。...unsigned int ignore_status_mask: 用于指定忽略状态屏蔽。 struct uart_state *state: 指向该串口设备所在状态结构体指针。...unsigned int custom_divisor:自定义除数,用于实现非标准波特率。这个值通常由驱动程序设置。 unsigned int line:端口索引,用于标识该UART端口编号。...如果给定波特率为 38400,并且端口标志值为 UPF_SPD_CUST,则需要使用端口自定义分频器值,而不是根据公式计算出来值。...根据 cflag 中 CSIZE 标志,确定每个字节位数(5、6、7 或 8 ),并根据 CSTOPB 和 PARENB 标志,增加停止和奇偶校验位数。

    64010
    领券