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

在C中以整数查找最高设置位(msb)的最快/最有效方法是什么?

在C语言中,以整数查找最高设置位(msb)的最快/最有效方法是使用位操作。具体来说,可以使用以下方法:

代码语言:c
复制
int find_msb(int x) {
    int msb = -1;
    while (x != 0) {
        msb++;
        x >>= 1;
    }
    return msb;
}

这个方法的原理是,当给定一个整数x时,将其右移一位,直到x变为0。在每次右移时,都将计数器加1。这样,计数器的值就是整数x的最高设置位。

需要注意的是,这个方法只适用于非负整数。如果需要处理负数,需要进行相应的调整。

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

相关·内容

Protobuf编码指南

除了最后一个字节外,varint编码每个字节都设置最高有效(most significant bit - msb)–msb为1则表明后面的字节还是属于当前数据,如果是0那么这是当前数据最后一个字节数据...每个字节低7用于7为一组存储数字二进制补码表示,最低有效组在前,或者叫最低有效字节在前。这表明varint编码后数据字节是按照小端序排列。...然后,将它们连接起来获得最终值 000 0010 010 1100 (去掉最高有效,并反转7组)→ 000 0010 ++ 010 1100→ 100101100→ 256 + 32 +...为此,有线格式消息每个对“键”实际上是两个值-.proto文件字段编号,加上一种有线类型,该类型仅提供足够信息来查找随后长度。大多数语言实现,这个键称为标签。...你现在知道字节流首个字节永远都是一个varint键,我们例子它是08或者下面的二进制(去掉了msb)。 000 1000 通过后三得出有线类型(0),然后右移三得到字段编号(1)。

1.3K10

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

,Brian Kernighan方式 使用64指令对14、24或32设置进行计数 并行设置计数位 从最高有效到给定位置计数位设置(等级) 从给定计数(等级)中选择位置(从最高有效开始...,无除法) 通过7个操作反转字节(无64,仅32) 与5 * lg(N)个运算并行地反转N位数量 模数除法(又名计算余数) 不进行除法运算情况下,将模数除以1 << s(显而易见) 不进行除法运算情况下...(1 << s)-1计算模数除法 不进行除法运算就并行计算(1 << s)-1模数除法 查找整数整数对数2(又称最高位集位置) 使用O(N)运算找到MSB N设置整数对数2(显而易见方法)...查找具有64IEEE浮点数整数整数对数2 使用查找表找到整数对数2 O(lg(N))运算中找到N整数对数2 使用乘法和查找O(lg(N))操作中找到N整数对数2 查找整数对数以10...(后跟) 通过浮法舍入到2下一个最高幂 向上舍入到2下一个最高幂 交织(也称为计算莫顿数) 交错位明显方式 通过表查找交织 带64乘法交织 通过二进制幻数交错位 测试单词字节范围(并计算出现次数

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

    ,Brian Kernighan方式 使用64指令对14、24或32设置进行计数 并行设置计数位 从最高有效到给定位置计数位设置(等级) 从给定计数(等级)中选择位置(从最高有效开始...,无除法) 通过7个操作反转字节(无64,仅32) 与5 * lg(N)个运算并行地反转N位数量 模数除法(又名计算余数) 不进行除法运算情况下,将模数除以1 << s(显而易见) 不进行除法运算情况下...(1 << s)-1计算模数除法 不进行除法运算就并行计算(1 << s)-1模数除法 查找整数整数对数2(又称最高位集位置) 使用O(N)运算找到MSB N设置整数对数2(显而易见方法)...查找具有64IEEE浮点数整数整数对数2 使用查找表找到整数对数2 O(lg(N))运算中找到N整数对数2 使用乘法和查找O(lg(N))操作中找到N整数对数2 查找整数对数以10...(后跟) 通过浮法舍入到2下一个最高幂 向上舍入到2下一个最高幂 交织(也称为计算莫顿数) 交错位明显方式 通过表查找交织 带64乘法交织 通过二进制幻数交错位 测试单词字节范围(并计算出现次数

    1.2K41

    详解varint编码原理

    什么是Varint编码 Varint是一种使用一个或多个字节序列化整数方法,会把整数编码为变长字节。...编码原理 除了最后一个字节外,varint编码每个字节都设置最高有效(most significant bit - msb)–msb为1则表明后面的字节还是属于当前数据,如果是0那么这是当前数据最后一个字节数据...每个字节低7用于7为一组存储数字二进制补码表示,最低有效组在前,或者叫最低有效字节在前。这表明varint编码后数据字节是按照小端序排列。...例如,一个多位整数,按照存储地址从低到高排序字节,如果该整数最低有效字节(类似于最低有效最高有效字节前面,则称小端序;反之则称大端序。...0x80|uint8(x&0x7F)是取出x后7个bit最高位加上1(msb) 解码实现 解码就是编码逆过程,同样是用运算就能快速有效完成解码,结合下面的代码注释再在纸上推演一遍理解起来就不难了

    2.7K10

    dsp指令ixh_C24XX系列DSP移位指令总结

    ;由TREG低4数值所决定移位量,允许用户动态调整数比例系数,从而来适应不同要求系统性能; 4>(0—16)左移时,最低位填0,未用最高位填0或进行符号扩展,这要由SXM值决定:SXM=...0,填0;SXM=1,则未使用最高有效填0或1,进行符号扩展; 5>两种方法获得左移位数:指令中直接设置移位位数或TREG最低4提供移位位数; B、乘积移位器(PSCALE) 1>其数据来源PREG...SXM影响; ror— 累加器逻辑循环右移—右移一CMSB,LSB入C,不受SXM影响; sfl — 累加器算术左移—最高位入C,最低位补0,不受SXM影响; sfr — 累加器算术右移—受SXM...影响: 若SXM=1,为算术右移,符号(最高有效)不变且被复制到位30,0入C; 若SXM=0,为逻辑右移,ACC中所有右移一,LSB入C,MSB填0; 注意:有的移位受符号扩展方式(SXM...)影响,注意正确设置SXM值,达到预期目标; 关键字:TMS320LF2407 TMS320C2000 DSP 移位 指令 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn

    91210

    软硬件融合技术内幕 终极篇 (4) —— 人类历史丰碑

    几乎所有的小学生都会问老师一个问题:一个较小自然数,减去一个较大自然数结果是什么呢? 初中数学,答案很简单:负数。 而两个自然数加法,依然是自然数。...其规律是,想得到一个整数相反数,就将其按取反再加1,并通过最高bit来作为标志,判断是正数还是负数。...8bit整数为例: 00000000到01111111,也就是表示正数0-127; 10000000到11111111,也就是表示负数-128到-1; 最高有效(MSB,Most Significant...Bit)为正负标志MSB为0时候为正数,MSB为1时候为负数。...特别地,对多位数乘法需要列竖式进行: 类似地,计算机也需要通过类似“列竖式”方法来解决乘法问题。 在下一期,我们会详解计算机乘法实现。 本期内容实际上涉及到一个名词:伽罗华域。

    43040

    几道算法题记录

    1000 0000, 通过 | 运算最高位补 1 var MSB = 0x80; // 0x7F二进制表示是 0111 1111 var REST = 0x7F;...假设数据类型为byte负数-11,其二进制计算机是用补码表示,计算过程如下 正数原码: 00001011 反码: 11110100 补码(反码加1): 11110101 处理过程: 左移一...return Math.round(1 / expectationP * 100) + '%'; } (4)给定16进制输入,判断它是否为有效 UTF-8序列;以及给定一串16进制,判断里面包含几个...简单核心代码 return (n & (n –1)) == 0 21次方为2,二进制表示为10 22次方为4,二进制表示为100 23次方为8,二进制表示为1000 … 也就是说2次方,它最高位为...(对应整数12),右移一 11(对应整数3) -6,对应二进制(32表示)11111111 11111111 11111111 11111010 正数6二进制(32) 00000000 00000000

    21820

    Python Elias Delta 编码

    作者主页:海拥 作者简介:CSDN全栈领域优质创作者、HDZ核心组成员、蝉联C站周榜前十 本文中,我们将使用 python 实现 Elias Delta 编码。...从用户获取输入 k Elias Gamma 中进行编码。 使用数学模块 floor 和 log 函数,找到 1+floor(log2(X) 并将其存储变量 N 。...使用 (N-1)*‘0’+‘1’ 找到 N 一元编码,它为我们提供了一个二进制字符串,其中最低有效为 ‘1’,其余最高有效为 N-1 个’0’。...使用“{0:b}”.format(k) 找到 k 二进制等效项并将其存储名为 binary 变量。 前缀零仅指定应使用 format() 哪个参数来填充 {}。...= binary[1:] return binary_without_MSB 现在我们要为 Elias Delta Encoding 编写代码 第 3 步: 从用户获取输入 k Elias Delta

    65130

    《计算机系统基础》—— 运算

    文章目录 《计算机系统基础》——运算 整数运算 作用 操作 位移运算 作用 操作 乘法运算 除法运算 浮点数 加减运算 乘除运算 《计算机系统基础》——运算 本章我们需要介绍是有关C...整数运算 作用 按运算在我们日常开发中出现比较少,他作用主要就是对位串实现“掩码”(mask)操作或相应其他处理,比如在嵌入式领域一般用来控制寄存器值,达到相应功能。...操作 左移: x<<k(乘2) 右移: x>>k(除2) 逻辑右移:左边补k个0 算数右移:左边补k个最高有效数字 我们在下方给出关于逻辑右移和算数右移例子来帮助大家理解。...答案很简单,会对数据取余,比如对32数据右移36,其实就是右移4。 乘法运算 高级语言中,两个n整数相乘得到结果通常也是 一个n整数,也即结果只取2n乘积低n。...---- 整数乘法运算比移位和加法等运算所用时间长,因此,编译器处理变量与常数相乘时,往往移位、加法和减法组合运算来代替乘法运算,所以我们可以使用位移来代替乘法指令,比如x * 20,因为20 =

    43810

    进制介绍与转换

    1.1 无符号二进制整数 计算机是电子电荷集合方式在内存宝保存指令和数据,二进制数用两个数字作基础,其中每一个二进制数成为bit不是0就是1.自右向左,从0开始顺序增加,左边称为最高有效(Most...Significant Bit MSB),右边称为最低有效(LSB least significant Bit).一个16二进制数 其MSB和LSB如下所示: MSB...6 A 2 Y| 4 9 A S| B 3 C 1.3 有符号二进制整数数 有符号二进制整数有正数和负数.x86处理器,MSB表示是符号:0表示正数...将一个二进制数按取反(求补)加1,就形成了它补码.8二进制数0000 0001为例,求其补码为1111 1110,求补码过程如下: 初始值 0000 0001...通过检查十六进制最高有效(最高),就可以知道该数是正数还是负数,如果最高位>=8改数是负数.如果最高位<=7,该数是正数.比如,十六进制数8A20是负数,二7FD9是正数. 2.0 最大值和最小值

    1.6K20

    C51浮点数显示、浮点数表示方法

    C51浮点数存储方式 –n年前曾在c51bbs论坛中发布过 Float 浮点形,它是符合IEEE-754标准单精度浮点形数据,十进制具有7有效数字。...127到+128之间值,尾数是一个24值(代表大约7个十进制数),最高MSB通常是 1,因此不保存。...M 24尾数保存在23,只存储23最高位固定为1。此方法较少位数实现了 较高有效位数,提高了精度。 零是一个特定值,幂是0 尾数也是0。...使用科学记数法时,整数部分占1,所 小数部分最大占7-1=6,即最大有6十进制精度。 长整形数和浮点数都占4字节,但表示范围差别很大。...小于1.175494E-38数仍可以显示一些,但最好不用,以免出 错。我采用直接判断方法,剔除此种情况。 计算机里结合律不成立,(a*b)*c!

    1.5K30

    冷饭新炒:理解JDKUUID底层实现

    中间变量msb或者lsb提取字节进行计算时候: 先进行左移8确保需要计算为0,已经计算好位移动到左边 然后右边需要提取字节data[i]8会先和0xff(补码1111 1111)进行或运算...& 0000_1111 = 0000_1111 得到randomBytes[6] = 0000_1111 (这里可见高4比特被清空为0) // 设置version整数4 => 十六进制0x40 =>..._1111 & 0011_1111 = 0011_1111 // 设置variant整数128 => 十六进制0x80 => 二级制补码1000_0000 (这里取左边高位2) randomBytes...version()、variant()其实就是找到对应,并且转换为十进制整数返回,如果熟练使用运算,应该不难理解,后面不会分析这类Getter方法。...Linux环境下,SecureRandom实例化后,不通过setSeed()方法设置随机数作为种子,默认就是使用/dev/random提供安全随机数接口获取种子,产生随机数是密码学意义上安全随机数

    1.2K50

    《计算机系统基础》——数据表示

    无符号整数 (Unsigned integer) 整数,我们用 LSB来表示最低有效,用MSB来表示最高有效,之所以这样规定,主要就是我们整数,一般最高位用来表示符号。...带符号整数(Signed integer) 而带符号整数,则是用MSB来表示数符(0–正数,1–负数),并且是采用补码来表示带符号整数。...若同时有无符号和带符号整数,则C编译器将带符号整数强制转换为无符号数。 要注意带符号整数是采用补码来表示,所以才能得到表数值。...---- 不同规则下,编译器处理默认常量类型也不一样,具体如下所示。 这个是c90,无符号整型与long long类型有所区别。 C99规则下,则没有无符号整型。...最后C90运行结果如下所示。

    59430

    学习Protobuf,Varint是啥你真的知道么?

    这篇文章,是学习Protobuf过程偶然所得,算法简洁,篇幅较短,预计阅读时间 4 分钟,如果对您有帮助,还望不吝评价,求点赞、求评论、求转发。 Varint 是什么?...大多数计算机系统4 Bytes和8 Bytes 来表示整数(Int32、Int64)。...这样,为了传输一个整数1,我们需要传输00000000 00000000 00000000 00000001 32 个 bits,而有价值数据只有 1 ,这也太浪费了吧?...为了节约网络带宽,我们需要一种更加灵活方式传输方式。Varint(Variable length integers)便是一种用于压缩整型数值方法,通过它可以更加灵活表达整型数值需要空间大小。...Varint 原理 编码规则 a.将整数二进制按7bit分组,从低位到高位依次排列 b.最后一组MSB设置0,其他组MSB设置为1 编码演示 按7bit进行分组,对数组逆序设置MSB(Most Significant

    1.4K10

    基于 FPGA 数字表示

    例如, Motorola StarCore 和 TI C62x DSP 处理器都使用只有一个整数定点表示法。...2.4 小数部分截断   二进制, 截断是简单地将去除过程。 通常使用这种强制方法来将大二进制字长变小, 通常需要截掉最低有效 (LSB),该操作影响是降低了准确度。   ...如果截断最高有效 992 ( 或0.0992), 其结果将不是所希望, 而且也失去了意义。   ...二进制有效截断概念是很少使用十进制例子最高有效截断通常是灾难性。 然而, 某些极少情况下, 一系列操作将导致整个数值范围减小。...所以移除 MSB 也是有好处。   截断 MSB 通常发生在要截断为空时候。 当使用有符号值时, 由于丟失了符号, 截断 MSB 将会带来问题。

    1.2K20

    linux网络编程之socket(一):socket概述和字节序、地址转换函数

    然而,各种网络协议地址格式并不相同,如下图所示: IPv4和IPv6地址格式定义netinet/in.h,IPv4地址用sockaddr_in结构体表示,包括16端口号和32IP地址,如下所示...UNIX Domain Socket地址格式定义sys/un.h,用sockaddr_un结构体表示。...sockaddr *)&servaddr, sizeof(servaddr)); 二、网络字节序 字节序 大端字节序(Big Endian) 最高有效MSB:Most Significant...Bit)存储于最低内存地址处,最低有效(LSB:Lowest Significant Bit)存 储于最高内存地址处。...小端字节序(Little Endian) 最高有效MSB:Most Significant Bit)存储于最高内存地址处,最低有效(LSB:Lowest Significant Bit)存 储于最低内存地址处

    2K00

    浅谈MatrixOne如何用Go语言设计与实现高性能哈希表

    线性探测法对比其他方法,平均需要探测桶数量最多。但是线性探测法访问内存总是顺序连续访问,最为缓存友好。因此,冲突概率不大时候(max load factor较小),线性探测法是最快方式。...我们整数哈希函数也使用同样方法实现。...192再加上64value,每个桶宽度正好是32字节,可完全与CPUcacheline对齐。碰撞处理,不比较原始key,而是比较这192数据。...不同字符串两个哈希值同时碰撞概率极低,AP系统可以忽略不计。这样做优势是把变长字符串比较变成了定长3个64整数比较,而且还省掉一次指针跳转开销,大大加速碰撞检测过程。...随着反复迭代优化,以及不断尝试改变ClickHouse原本一些设计,最终哈希表插入和查找性能上竟然超越了C++版本。

    75330

    浅谈 Protobuf 编码

    0x02 Base 128Base 64 存在问题就是,编码后每一个字节最高总是 0,不考虑 pad 情况下,有效 bit 只占 bit 总数 75%,造成大量空间浪费。...使用一个或多个字节对整数进行序列化。小数字占用更少字节。简单来说,就是尽量只储存整数有效,高位 0 尽可能抛弃。...对于编码后每个字节,低 7 用于储存数据,最高位用来标识当前字节是否是当前整数最后一个字节,称为最高有效(most significant bit, msb)。...对于需要多个字节来储存数据,如 300 (0b100101100),有效位数为 9,编码后需要两个字节储存。下面是编码后整数300。第一个字节 msb 为 1,最后一个字节 msb 为 0。...一般来说,大多数语言中无符号整型被转换为 varints 之后,有效内容并没有改变。

    1.8K40
    领券