二分查找位运算——32位整数中寻找第一个为1的位

Xilinx FPGA芯片命名规则 1.1 Xilinx FPGA芯片命名规则 1.1.1 本节目录 1)本节目录; 2)本节引言; 3)FPGA简介; 4)Xilinx FPGA芯片命名规则; 5)结束语。 1.1.2 本节引言 “不积跬步,无以至千里;不积小流,无以成江海。就是说:不积累一步半步的行程,就没有办法达到千里之远;不积累细小的流水,就没有办法汇成江河大海。 1.1.3 FPGA简介 FPGA(Field Programmable Gate Array)是在PAL、GAL等可编程器件的基础上进一步发展的产物。 阅读详情

问题描述


在程序设计中经常会遇到这样一个问题,即在一个32位整数中,从右到左寻找第一个为1的位。这样的问题是很常见的,而面对这样一个问题,一种常见的解法就是逐位的遍历这个整数中的所有位,直到遇到了为1的位。若第一个为1的位出现在高位区域,逐位查找比较的方法会比较浪费时间。


换一种思路


当我们在一个数组中寻找某数的时候,我们有什么办法?简单的顺序的遍历整个数组的思想是可行的,这样的时间复杂度是o(n)。若数组是一个有序的数组呢?我们一般会采用2分查找的方式在一个数组中寻找某数,这样找起来就比较快了,时间复杂度是o(logn)。那在一个32位的int中寻找第一个为1的数,能否使用2分查找法呢?

在查找第一个为1的位时是可以使用2分查找法的,那么要如何使用2分法呢?关于位相关的操作一定不要忘了位运算,有效的运用位运算是可以实现对该问题的2分查找法。

究竟如何进行2分查找呢? 

判断某一位是否为1时可以使用&操作,那么要判断32位中的16位是否有1时要如何做到呢?用data & 0xFFFF即可。要判断8位是否有1时可以data & 0xFF,判断4位是否有1可以data & 0xF,那么判断2位是否有1就可以用data & 0x3了。

分析到这里,就已经有思路了,通过data与 0xFFFF,0xFF,0xF以及 0x3等做&操作即可。
从左到右

int binarysearch(int data)
{
	int pos=0;
	if ((data & 0xFFFF0000) == 0)
		pos += 16;
	else
		data >>= 16;
	
	if ((data & 0xFF00) == 0)
		pos += 8;
	else
		data >>= 8;
	
	if ((data & 0xF0) == 0)
		pos += 4;
	else
		data >>= 4; 

	if ((data & 0xC) == 0)		// 0b1100
		pos += 2;
	else
		data >>= 2; 

	if ((data & 0x2) == 0)		// 0b10
		pos += 1;

	return pos;
}


从右到左

int binarysearch(int data)
{
        int pos=0;
        if ((data & 0x0000FFFF) == 0){
                data >>= 16;
                pos += 16;
        }

        if ((data & 0x00FF) == 0){
                data >>= 8;
                pos += 8;
        }

        if ((data & 0x0F) == 0){
                data >>= 4;
                pos += 4;
        }

        if ((data & 0x3) == 0){         // 0b1100
                data >>= 2;
                pos += 2;
        }

        if ((data & 0x1) == 0)          // 0b10
                pos += 1;

        return pos;
}


小结

位运算在C语言中是非常重要的,很多有技巧性的优化都是通过位运算来实现,需要熟练掌握才行。

当然针对特定的处理器还可以做些指令级的优化,比如在x86上记得有一条指令就可以完成这个功能了。

(从网友博客转帖过来,原来代码有误这里做了些修改)



PCIe 全解析笔记:从协议本质到工程实现 学习 PCIe,最容易陷入的误区是直接跳进协议手册(Base Spec 1300 多页),然后在 TLP 字段、LTSSM 状态、Ordering Rules 中迷失方向。正确的思维路径历史维度:从 PCI 到 PCIe,解决了什么核心矛盾?抽象维度:协议栈分层的真正意图是什么?工程维度:高速串行链路面临哪些物理挑战?协议如何应对?系统维度:作为 CPU 与外设的"动脉",PCIe 如何融入整个计算机体系?带着这四个视角去看每一个细节,知识才能内化为认知。 阅读详情

相关推荐

免费替代Cursor!TRAE中文版这些隐藏功能90%的人不知道

本文深度评测了免费AI编程工具TRAE中文版,揭示其超越代码补全的隐藏功能。重点介绍了其SOLO模式如何重塑从需求到部署的全流程开发,以及对微信小程序、Taro、Ant Design Pro等国产技术栈的深度适配能力,为中文开发者提供了高度本地化的高效解决方案。

gray5的博客 839

C语言小结--求一个整数中bit位为1的个数

最近开发需要将一个数据做奇偶校验,首先就是要计算出这个数据中bit位为1的个数,有以下几种算法可以达到要求: 1 方法1 我直接上代码,然后分析。 uint16_t get_one_in_data_1(uint16_t data) { uint16_t n = 0; while (data > 0) { if (data & 0x01...

静静流淌的柯溪的博客 8677

PCB布线避坑指南:晶振布局的5个致命错误(附正确示例图)

本文深入解析PCB布线中晶振布局的5个致命错误,包括底层布线、电容布局、地平面处理等关键问题,并提供实战解决方案。通过真实案例和量化数据,帮助硬件开发者避免常见陷阱,提升电路稳定性和性能。特别针对晶振这一高敏感元件,给出布线参数黄金法则和三维避让原则。

weixin_29215391的博客 428

最左侧1问题

今天给大家介绍一个有趣的位运算题目,叫最左侧1问题,英文名叫count leading zeros或most significant bits problem。问题比较好理解,就是给定一个整数,然后看最左侧的1出现在什么位置,等价于寻找整数的最高有效位或者前置零的个数。比如,0x128只有一个1,从右侧遍历1出现在第7位(从0开始计数)。我们给出几种不同的解法。以下解法返回的均是从右侧遍历的位置。

姚光超的专栏 6373

Halcon实战:5分钟搞定金属表面划痕检测(附完整代码解析)

本文提供了一份基于Halcon的金属表面划痕检测实战指南。通过核心的动态阈值算法,快速从图像中提取局部对比度异常区域,并结合形态学后处理与特征筛选,精准识别划痕。文章详解了从代码搭建、参数优化到工业场景适配的全流程,帮助工程师在五分钟内构建稳定高效的机器视觉检测方案。

weixin_29084231的博客 495

《Long-CLIP: Unlocking the Long-Text Capability of CLIP》

总的来说,Long-CLIP是一个改进的视觉-语言预训练模型,它通过知识保留的位置上插值和主要成分匹配策略,有效解决了原始CLIP模型在处理长文本输入时的限制。这一模型不仅在长文本图像检索任务中表现出色,而且在零样本图像分类任务中保持了与原始CLIP相当的性能,同时还能以即插即用的方式增强图像生成任务中的长文本处理能力。

Angelina_Jolie的博客 1378

编写函数,找到位向量最左边的1,将其后所有位置0

代码如下: int leftmost_one(unsigned x) { x |= (x >> 1); x |= (x >> 2); x |= (x >> 4); x |= (x >> 8); x |= (x >> 16); return (x & ((~x >> 1) | 0x80000000)); }

Tyrion Lannister's Special column 1079

uniapp [全端兼容] - 详细实现人脸识别和活体检测功能,实时监测人脸是否进入区域及动作是否正确播报,免费自动提示引导动作及语音,提供提供实名认证、身份证识别、人脸信息采集、刷脸扫脸认证示例代码

uniapp,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,人脸识别,扫脸认证,人脸认证,活体认证,身份认证,uni-app人脸识别详细教程,如何在app端实现免费人脸识别教程,如何在小程序端做,最好用的插件,安卓ios百度人脸识别、活体检测、人脸采集APP,H5人脸识别带前后摄像头,适合新手看的人脸识别功能教程,详细示例代码源码,有没有免费的,接入百度,阿里云人脸识别,百度,api,活体检测,数据采集,动作提示指引,语音提示指引,报错,无法核验一直出错,根本用

🏆 前端领域优质创作者 1万+

如何在43亿个32位整数中,找出一个出现至少两次的整数

本文分别用位图法、哈希法、二分查找法来解决“如何在43亿个32位整数中,找到一个重复数”的问题。

猫晨的技术小屋 1355

从 on_event 到 lifespan:FastAPI 生命周期管理的旧方法与新方法对比与迁移

从 on_event 到 lifespan:FastAPI 生命周期管理的旧方法与新方法对比与迁移

XiaoqiangClub的博客 1021

【雕爷学编程】Arduino智慧交通之RF24通信实现车队之间的实时通信和协调

通过这些示例,车队领导可以发送指令给车队成员,车队成员可以接收指令并执行相应的操作,同时车队成员也可以发送自己的位置信息给车队领导或其他成员,以实现车队之间的实时通信和协调。例如,在高速公路上,车队中的车辆可以根据前方车辆的速度和位置信息,自动调整自身的速度和距离,以保持车队的整体稳定和安全。Arduino智慧交通系统利用RF24通信模块实现车队之间的实时通信和协调,通过无线通信技术,车辆之间可以实时传输数据和指令,以实现车队的协同行驶和交通优化。通过数据处理和分析,可以生成实时的交通信息和统计数据。

雕爷学编程 1074

[二分查找 双指针 位运算] 287.寻找重复数(值域二分、位运算、快慢指针找环入口)

[二分查找 双指针 位运算] 287.寻找重复数(值域二分、位运算、快慢指针找环入口)287.寻找重复数题目分析思路1:值域二分(非常规二分,时间换空间,O(NlogN))思路2:位运算(O(N))实现遇到的问题:思路3:快慢指针法(数组 → 链表,环入口 = 重复数,O(N)) 287.寻找重复数 题目链接:https://leetcode-cn.com/problems/find-the-duplicate-number/ 分类: 二分查找(对数组元素的值域做二分寻找重复数值) 位运算(统计数组所有

m0_38142029的博客 407

实战干货|.NET9 C#上位机:多PLC并发通信+数据防丢+指令精准下发(10台设备实测+踩坑实录)

摘要:本文介绍了一个基于.NET9重构汽车零部件产线10台西门子S7-1200 PLC并发通信的工业级解决方案。针对原有系统存在的同步轮询阻塞、数据丢失、指令重复等问题,采用连接池复用、异步并发控制、超时隔离等技术,实现800ms内完成10台PLC并发采集、零丢包率、100%指令精准下发。方案通过.NET9的ThreadPool调度优化和ValueTask内存管理,将CPU占用控制在15%以内,解决了多PLC通信中的并发冲突、超时扩散等核心痛点,并提供了可直接复用的工业级代码实现。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 452

Leetcode二分查找(5)

Newton 迭代公式:y_{k+1} = (y_k + x / y_k) / 2。但需要 O(√x) 次循环,无法满足 O(log x) 要求,仅作数学性质展示或当 x 很小(例如 < 10^6)且代码极简的情况。满足题目 O(log x) 要求的:1(二分)、2(牛顿平均情况下很快,迭代次数 ~ O(log log x) 数值方法)、3(固定 ~ 16 或 32 次迭代)。该方法时间 O(log x),常数小,完全整数运算,适合对位运算有要求或在无除法环境下(可用加法和移位判断平方)略作改造。

rainsky1992的博客 961

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

基于java中Arrayy.binarySearch的二分查找

二分查找的知识点和实现

JJpZh的博客 262

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LeetCode 题解记录 - 二分查找

刷题 - 二分查找 [TOC] 两数相除 29. 两数相除 中等 题目描述: 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 输入: dividend = 10, divisor = 3 输出: 3 输入: dividend = 7, divisor ...

weixin_34318326的博客 163

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

代码随想录算法训练营Day1 | 二分查找、移除元素、有序数组的平方

来了来了,报名参加了11月的算法训练营,全长两个月,蒟蒻的研一新生为了就业而奋斗(不是实际是:从训练营寻找到了push动力 😃。

SapientialM的成长历程 1316

380,缺失的第一个正数(中)

想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11,12] 输出: 1 问题分析 这道题最容易想到的就是暴力求解,我们从1到数组的长度一个个找,如果找到了就继续寻找下一个,如果没找到就直接返回,代码很简单,我们来看下 0

数据结构和算法 166

Biomni 本地部署指南:从环境搭建到跑通 3 个生物医学分析任务

如果手上有一批单细胞测序数据要注释,或者要设计一轮 CRISPR 筛选实验,Biomni 的本地部署能直接把这些事跑起来:任务用自然语言下达,代码在你自己的机器上执行,数据不出本机。这篇指南按"先看产出 → 再装环境 → 再理解内部机制 → 最后踩坑"的顺序写,目标是让一个没接触过 agent 框架的研究者,从 clone 仓库到拿到第一个可用结果的路径最短。 [![Biomni 生物医学AI代

gitblog_00705的博客 1001

大厂算法面试之leetcode精讲9.位运算

大厂算法面试之leetcode精讲9.位运算 视频教程(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12.堆 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 位运算基础: 程序中所有的数载计算机内存中都是以

bemystery的博客 374

力扣 29. 两数相除:不使用乘除与取模实现整数除法的边界处理与性能优化

本篇技术解析围绕 InterviewGuide 仓库「精选力扣 300+ 道算法题」之「二分查找」分类中的 [29. 两数相除](https://link.gitcode.com/i/e608d5802406576204619102f6a1b991) 展开,逐行剖析阿秀记录的第一版「减法迭代」实现为何超时,并深入讲解 32 位有符号整数溢出边界(INT_MIN 与 -1)的防护、符号处理策略,最后

gitblog_00914的博客 200

力扣题解| 41. 缺失的第一个正数

41. 缺失的第一个正数 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。 示例1: 输入: [1,2,0] 输出: 3 示例2: 输入: [3,4,-1,1] 输出: 2 示例3: 输入: [7,8,9,11,12] 输出: 1 1,暴力求解 首先最容易想到的就是暴力求解,从1开始一个个查找,没找到就直接返回 public int firstMissingPositive(int[] nums) { for (int i = 1...

KevinBrain的博客 468

面试常客:位运算找最低位1的经典解法,你真的理解 `data & -data` 吗?

本文深入解析了位运算中`data & -data`这一经典解法,用于高效找到整数二进制表示中最低位的1。通过补码原理和具体示例,详细拆解其数学基础和工作机制,并探讨了在算法优化、位图索引等实际开发场景中的应用价值。

weixin_30292843的博客 215

二分查找进阶玩法,旋转数组搜索与整数除法优化

本文深入解析二分查找进阶玩法,重点探讨旋转数组搜索与位运算模拟整数除法。通过利用局部有序性和倍增思想,在禁止使用除法运算符等约束下,依然保持 O(log n) 的高效性能,帮助开发者掌握算法核心逻辑与边界处理技巧。

修己xj的博客 240

12 二分查找和二分查找和实现以及求平方根

12 二分查找和二分查找和实现以及求平方根

weixin_43859562的博客 833
上一篇: Linux CPU affinity
下一篇: git 使用(ssh key创建和github使用)
xianjian_x
博客等级 码龄14年 231粉丝 43原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值