位运算的基本概念+通过 Brian Kernighan算法计算 lowbit 实现的奇技淫巧 python
目录
- 引入
- 判断奇偶
- 位运算概念
- 进入正题
- Brian Kernighan 算法
- lowbit 介绍
- 判断幂
- 举一反三
- 牛刀小试
- 汉明重量
- 总结
引入
判断奇偶
假设你不知道位运算为何物:你怎么判断奇偶呢?
n = int(input())
if n % 2 == 0:print(f"{n}是偶数")
else:print(f"{n}是奇数")
但你知道了位运算中的与运算,你可以做到:
n = int(input())
if n & 1:print(f"{n}是奇数")
else:print(f"{n}是偶数")
那什么是位运算呢?请往后看
位运算概念
异或运算可点此进入查看:详细介绍
进入正题
介绍奇技淫巧环节
Brian Kernighan 算法
实现:提取一个二进制数字最右边的1 即lowbit
假设一个8位的二进制数:
n=10110100
~n=01001011 (~为取反符)
~n+1 = 01001100 (取反加一即为求n的补码即-n)
观察到 :
要取的1左边:n与(~n+1)相反,
要取的1右边:n与(~n+1)都为0
怎么实现1的左右两边都变为0呢?答案是 与运算&
n & (~n+1) 就能得到 00000100 即lowbit
又(~n+1)就是-n
所以 lowbit = n & (-n)
lowbit 介绍
这很重要,下面有大用
判断幂
判断一个整数是不是2的幂
2 的幂 https://leetcode.cn/problems/power-of-two/
举几个例子:
0001 = 2^0 ; 0010 = 2^1 ; 0100 = 2^2 ······
所以2的幂即二进制表示中只有一位是1
那如果 n==lowbit(n),就可以说n为2的幂
借助Brian Kernighan 算法可以一行代码轻松实现
code如下:
class Solution:def isPowerOfTwo(self, n: int) -> bool:return n > 0 and n == (n & -n)
举一反三
求大于等于n的2的幂
举个例子:
n=39 转为二进制 即00100111
答案应该是01000000 即64
所以大于等于n的2的幂就是 取最左边的1 再左边的那一位为1,其余位取0
题外话:
判断一个整数是不是3的幂(与位运算无关,感兴趣的话可以想想)
3的幂 https://leetcode.cn/problems/power-of-three/description/
牛刀小试
数字范围按位与 https://leetcode.cn/problems/bitwise-and-of-numbers-range/description/
返回【left,right】区间所有元素按位与运算的结果
直接暴力O(n)会超时,那应该怎么做呢?
请看好,不要眨眼
假设right=00101101
倘若left=right,则直接return right ,没问题。
若left<right:那么right-1是不是一定在【left,right】内
right-1 = 00101100
right = right & (right-1) = 00101100(抹去了最右边的1,即lowbit)
再下去倘若left=right,则直接return right
若left<right:那么right-1是不是一定在【left,right】内
right-1 = 00101011
right = right & (right-1) = 00101000(抹去了最右边的1,即lowbit)
······直到left=right,返回right
是的,这是一个while循环,right里有几个1,就做几次。
这实现了近似O(1)的时间复杂度
汉明重量
这就是Brian Kernighan 算法的另一个重要作用:
计算一个二进制表示中1的数量(即汉明重量,Hamming Weight)。
这个算法比逐位检查的方法更高效,因为它只遍历输入整数中1的个数次。
算法原理:
该算法的核心思想是:每次将整数 n 和 n−1 进行按位与运算,可以消除 n 的二进制表示中最右边的1。
通过重复这一过程,直到 n 变为0,我们可以统计出 n 中1的个数。
code如下:
class Solution:def rangeBitwiseAnd(self, left: int, right: int) -> int:while left < right:right -= right & (-right)return right
真是米奇妙妙屋啊 太妙了!这值得好好体会
将 -1 再 & 的操作简化成抹掉最右侧的 1,极致的 “骚操作”
总结
位运算实现速度非常快,仅仅次于赋值操作,需要好好掌握。
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢
相关文章:
位运算的基本概念+通过 Brian Kernighan算法计算 lowbit 实现的奇技淫巧 python
目录 引入判断奇偶位运算概念 进入正题Brian Kernighan 算法lowbit 介绍判断幂举一反三牛刀小试汉明重量总结 引入 判断奇偶 假设你不知道位运算为何物:你怎么判断奇偶呢? n int(input()) if n % 2 0:print(f"{n}是偶数") else:print(f&q…...
vscode环境中用仓颉语言开发时调出覆盖率的方法
在vscode中仓颉语言想得到在idea中利用junit和jacoco的覆盖率,需要如下几个步骤: 1.在vscode中搭建仓颉语言开发环境; 2.在源代码中右键运行[cangjie]coverage. 思路1:编写了测试代码的情况(包管理工具) …...
【测试】UI自动化测试
长期更新,建议关注收藏点赞! 目录 概论WEB环境搭建Selenium APPAppium 概论 使用工具和代码执行用例。 什么样的项目需要自动化? 需要回归测试、自动化的功能模块需求变更不频繁、项目周期长(功能测试时长:UI自动化测…...
ThinkPHP 8的多对多关联
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...
利用 SoybeanAdmin 实现前后端分离的企业级管理系统
引言 随着前后端分离架构的普及,越来越多的企业级应用开始采用这种方式来开发。前后端分离不仅提升了开发效率,还让前端和后端开发可以并行进行,减少了相互之间的耦合度。SoybeanAdmin 是一款基于 Spring Boot 和 MyBatis-Plus 的后台管理系…...
【Uniapp-Vue3】request各种不同类型的参数详解
一、参数携带 我们调用该接口的时候需要传入type参数。 第一种 路径名称?参数名1参数值1&参数名2参数值2 第二种 uni.request({ url:"请求路径", data:{ 参数名:参数值 } }) 二、请求方式 常用的有get,post和put 三种,默认是get请求。…...
【安当产品应用案例100集】034-安当KSP支持密评中存储数据的机密性和完整性
安当KSP是一套获得国密证书的专业的密钥管理系统。KSP的系统功能扩展图示如下: 我们知道商用密码应用安全性评估中,需要确保存储的数据不被篡改、删除或者破坏,必须采用合适的安全方案来确保存储数据的机密性和完整性。KSP能否满足这个需求呢…...
如何实现网页不用刷新也能更新
要实现用户在网页上不用刷新也能到下一题,可以使用 前端和后端交互的技术,比如 AJAX(Asynchronous JavaScript and XML)、Fetch API 或 WebSocket 来实现局部页面更新。以下是一个实现思路: 1. 使用前端 AJAX 或 Fetch…...
【真机调试】前端开发:移动端特殊手机型号有问题,如何在电脑上进行调试?
目录 前言一、怎么设置成开发者模式?二、真机调试基本步骤? 🚀写在最后 前言 edge浏览器 edge://inspect/#devices 谷歌浏览器(开tizi) chrome://inspect 一、怎么设置成开发者模式? Android 设备 打开设…...
ASP.NET Core 6.0 如何处理丢失的 Startup.cs 文件
介绍 .NET 6.0 已经发布,ASP.NET Core 6.0 也已发布。其中有不少变化让很多人感到困惑。例如,“谁动了我的奶酪”,它在哪里Startup.cs?在这篇文章中,我将深入研究这个问题,看看它移动到了哪里以及其他变化。…...
利用Java爬虫获取eBay商品详情:代码示例与教程
在当今的电商时代,获取商品详情数据对于市场分析、价格监控和竞品研究至关重要。eBay作为全球最大的电商平台之一,拥有海量的商品信息。通过Java爬虫技术,我们可以高效地获取这些数据,为商业决策提供支持。本文将详细介绍如何使用…...
graylog~认识一下-日志管理平台
1、介绍 Graylog 是一个开源的日志管理和分析平台,旨在帮助企业集中收集、存储、搜索和分析来自各种来源的日志数据。它提供了强大的实时日志处理能力,适用于大规模分布式系统和复杂的生产环境。 主要功能 集中化日志管理: 收集来自不同来源…...
Vue 拦截监听原理
Vue 渐进式JavaScript 框架 学习笔记 - Vue 拦截监听原理 目录 拦截监听原理 如何跟踪变化 拦截监听示例 观察者 注意:vue3的变化 总结 拦截监听原理 如何跟踪变化 当你把一个普通的Javascript 对象传入 Vue 实例作为data选项,Vue 将遍历此对象所有的proper…...
C# 解析 HTML 实战指南
在网页开发和数据处理的场景中,经常需要从 HTML 文档里提取有用的信息。C# 作为一门强大的编程语言,提供了丰富的工具和库来实现 HTML 的解析。这篇博客就带你深入了解如何使用 C# 高效地解析 HTML。 一、为什么要在 C# 中解析 HTML 在实际项目中&…...
idea新增java快捷键代码片段
最近在写一些算法题,有很多的List<List这种编写,想着能否自定义一下快捷键 直接在写代码输入:lli,即可看见提示...
网络与信息安全:企业如何正确实施电子邮件监控,防止内忧外患?
什么是电子邮件监控? 电子邮件监控对于保护公司免受因员工的恶意活动或外部攻击(如网络钓鱼、垃圾邮件等)而导致的不良事件的影响非常重要。实施员工电子邮件监控措施可能包括以下原因: 密切关注员工的官方电子邮件可确保员工有…...
blender 安装笔记 linux 2025
目录 linux安装blender: 运行后台渲染: 安装库: linux安装blender: # 进入下载目录 cd /shared_disk/users/lbg/soft/ # 下载 Blender 4.3.2 安装包 wget https://download.blender.org/release/Blender4.3/blender-4.3.2-l…...
99.11 金融难点通俗解释:净资产收益率(ROE)VS投资资本回报率(ROIC)VS总资产收益率(ROA)
目录 0. 承前1. 简述:三大收益率指标对比2. 比喻:三大指标对比2.1 简单对比2.2 生动比喻2.3 区别要点 3. 实际应用3.1 选择建议 4. 总结5. 实现代码 0. 承前 如果想更加全面清晰地了解金融资产组合模型进化论的体系架构,可参考: …...
【深度学习入门】深度学习知识点总结
一、卷积 (1)什么是卷积 定义:特征图的局部与卷积核做内积的操作。 作用:① 广泛应用于图像处理领域。卷积操作可以提取图片中的特征,低层的卷积层提取局部特征,如:边缘、线条、角。 ② 高层…...
最小距离和与带权最小距离和
1. 等权中位数 背景: 给定一系列整数,求一个整数x使得x在数轴上与所有整数在数轴上的距离和最小。 结论: 这一系列的整数按顺序排好后的中位数(偶数个整数的中位数取 n 2 或 n 2 1 \frac{n}{2}或\frac{n}{2}1 2n或2n1都可)一定是所求点…...
有哪些常见的 Vue 错误?
在使用 Vue.js 开发应用时,开发者可能会遇到各种错误。以下是一些常见的 Vue 错误以及如何避免它们:为了更详细地解释常见的 Vue.js 错误,我们可以深入探讨每个类别,并提供更多的背景信息和解决方案。以下是针对常见错误的扩展说明…...
查看电脑或笔记本CPU的核心数方法及CPU详细信息
一、通过任务管理器查看 1.打开任务管理器 可以按下“Ctrl Shift Esc”组合键,或者按下“Ctrl Alt Delete”组合键后选择“任务管理器”来打开。 2.查看CPU信息 在任务管理器界面中,点击“性能”标签页,找到CPU使用记录区域,…...
Python 轻松扫描,快速检测:高效IP网段扫描工具全解析
Python 轻松扫描,快速检测:高效IP网段扫描工具全解析 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着…...
AI Agent:AutoGPT的使用方法
AutoGPT的使用方法 准备工作: 安装Python:确保你的电脑上安装了Python 3.8或更高版本。获取OpenAI API密钥:访问https://platform.openai.com/account/api-keys获取API密钥,并保存备用。获取Google API及Google Search Engine ID(可选):若要使用谷歌搜索功能,需访问htt…...
RabbitMQ 在实际应用时要注意的问题
1. 幂等性保障 1.1 幂等性介绍 幂等性是数学和计算机科学中某些运算的性质,它们可以被多次应⽤,⽽不会改变初始应⽤的结果. 应⽤程序的幂等性介绍 在应⽤程序中,幂等性就是指对⼀个系统进⾏重复调⽤(相同参数),不论请求多少次,这些请求对系统的影响都是相同的效果. ⽐如数据库…...
ASP .NET Core 学习(.NET9)部署(一)windows
在windows部署 ASP .NET Core 的时候IIS是不二选择 一、IIS安装 不论是在window7 、w10还是Windows Server,都是十分简单的,下面以Windows10为例 打开控制面版—程序—启用或关闭Windows功能 勾选图中的两项,其中的子项看需求自行勾选&am…...
在Qt中实现点击一个界面上的按钮弹窗到另一个界面
文章目录 步骤 1:创建新窗口类步骤 2:设计窗口的 UI步骤 3:设计响应函数 以下是一个完整的示例,展示在Qt中如何实现在一个窗口中通过点击按钮弹出一个新窗口。 步骤 1:创建新窗口类 假设你要创建一个名为 WelcomeWidg…...
计算机组成原理(计算机系统3)--实验八:处理器结构拓展实验
一、实验目标: 了解MIPS的五级流水线,和在运行过程中的所产生的各种不同的流水线冒险;通过指令顺序调整,或旁路与预测技术来提高流水线效率;更加了解流水线细节和其指令的改善方法;更加深入了解动态分支预…...
pytest执行报错:found no collectors
今天在尝试使用pytest运行用例的时候出现报错:found no collectors;从两个方向进行排查,一是看文件名和函数名是不是符合规范,命名要是"test_*"格式;二是是否存在修改文件名的情况,如果修改过文件…...
Typescript 多个泛型参数详细解读
多个泛型参数的函数 : 函数中有多个泛型的参数。 示例: (() > {function getMsg<K, V>(value1: K, value2: V): [K, V] {return [value1, value2]}const arr1 getMsg<string,number>(jack,100.2345)console.log(arr1[0].split())console.log(arr1…...
等变即插即用图像重建
大家读完觉得有帮助记得关注和点赞!!! 摘要 即插即用算法为解决反问题成像问题提供了一个流行的框架,该框架依赖于通过降噪器隐式定义图像先验。这些算法可以利用强大的预训练降噪器来解决各种成像任务,从而避免了在每…...
安卓14自由窗口圆角处理之绘制圆角轮廓线
背景: 前面文章已经分享过: 如何一行代码搞定自由窗口的圆角处理?-wms/自由窗口/sf实战开发 但是又有学员朋友提出另一个blog的成果: 安卓aosp14上自由窗口划线边框Freeform Caption实战开发-千里马framework实战 想要把划线和…...
2025.1.25 关于c++学习中拷贝构造的问题
在各种构造函数中,比如带参数的和不带参数的构造函数,全缺省的构造函数,最特别的就是拷贝构造函数,当类的实例化对象作为参数进行传递时就要自动调用拷贝构造函数 1.基本形式 class Time{ public://全缺省构造函数Time(int year…...
满足不同场景的需求的智慧物流开源了
智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。构建基于Ai技术的…...
实现 iOS 自定义高斯模糊文字效果的 UILabel(文末有Demo)
引言 在实际的项目开发中,我们经常会遇到一些看似简单,但在实现时却充满挑战的需求。比如在开发付费通话功能时,我们需要展示最近通话的用户记录,其中包括用户的头像和昵称。为了保护用户隐私并且提升界面的美观性,我…...
【AI编辑器】字节跳动推出AI IDE——Trae,专为中文开发者深度定制
目录 一、背景 二、核心特性 2.1 AI驱动的代码自动生成 2.2 智能问答与代码补全 2.3 多语言支持 2.4 插件与扩展 三、架构 四、下载使用 4.1 下载与安装 4.2 界面与配置 五、应用实践 5.1 快速生成代码 5.2 智能问答与调试 5.3 团队协作与代码审查 六、与Cursor…...
Qt Creator 15.0.0如何更换主题和字体
1.打开Qt Creator 15.0.0 (Community), 2.点击编辑栏3.点击Preferences... 4.修改主题,点击环境,修改Theme:栏 5.修改字体大小,点击文本编辑器,修改字号栏。,修改Theme:栏...
Java开发提效秘籍:巧用Apache Commons IO工具库
一、引言 在 Java 开发的广袤领域中,输入输出(I/O)操作宛如一座桥梁,连接着程序与外部世界,从文件的读取与写入,到网络数据的传输,I/O 操作无处不在,其重要性不言而喻。然而…...
IDEA中Maven使用的踩坑与最佳实践
文章目录 IDEA中Maven使用的踩坑与最佳实践一、环境配置类问题1. Maven环境配置2. IDEA中Maven配置建议 二、常见问题与解决方案1. 依赖下载失败2. 依赖冲突解决3. 编译问题修复 三、效率提升技巧1. IDEA Maven Helper插件使用2. 常用Maven命令配置3. 多模块项目配置4. 资源文件…...
webrtc入门系列(五)amazon-kinesis-video-streams-webrtc-sdk-c编译
《webrtc入门系列(一)easy_webrtc_server 入门环境搭建》 《webrtc入门系列(二)easy_webrtc_server 入门example测试》 《webrtc入门系列(三)云服务器coturn环境搭建》 《webrtc入门系列(四&…...
全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析
本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中,我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现,以及基本的系统性能指标,包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…...
MySQL、HBase、ES的特点和区别
MySQL:关系型数据库,主要面向OLTP,支持事务,支持二级索引,支持sql,支持主从、Group Replication架构模型(本文全部以Innodb为例,不涉及别的存储引擎)。 HBase࿱…...
Windows远程连接Docker服务
问题背景 本地开发了一个SpringBoot项目,想通过Docker部署起来,我本地是Window11系统,由于某些原因不能虚拟化并且未安装Docker-Desktop,所以我在想有没有办法本地不需要虚拟化也不需要安装Docker-Desktop来实现支持Docker命令远…...
【前端知识】简单易懂的vue前端页面元素权限控制
文章目录 设计思路代码实现1. **权限数据管理**2. **权限判断方法**3. **动态控制元素**4. **路由权限控制**5. **无权限页面** 总结相关文献 在前端实现基于 Vue 的权限控制,通常需要结合后端返回的用户权限数据,动态控制页面元素的显示与隐藏、按钮的可…...
2024大模型双向突破:MoE架构创新与小模型崛起
标题:2024大模型双向突破:MoE架构创新与小模型崛起 文章信息摘要: 文章分析了2024年初大语言模型领域的两大技术发展方向:一是以Arctic为代表的新型MoE架构,通过480B总参数但仅17B活跃参数的设计实现高效企业级应用&a…...
电气防火保护器为高校学生宿舍提供安全保障
摘 要:3月2日,清华大学紫荆学生公寓发生火情,无人员伤亡。推断起火原因系中厅内通电电器发生故障引燃周边可燃物所致。2月27日,贵州某高校女生宿舍发生火灾,现场明火得到有效控制,无人员受伤。2月19日&…...
ChatGPT大模型极简应用开发-CH2-深入了解 GPT-4 和 ChatGPT 的 API
文章目录 2.1 基本概念2.2 OpenAI API 提供的可用模型2.3 在 OpenAI Playground 中使用 GPT模型2.4 开始使用 OpenAI Python 库2.4.1 OpenAI 访问权限和 API 密钥2.4.2 Hello World 示例程序 2.5 使用 GPT-4 和 ChatGPT2.5.1 ChatCompletion 端点的输入选项2.5.2 ChatCompletio…...
notepad++下载安装及使用笔记
文章目录 可以打开多大的文件可以打开多大的文件和内存设置有关吗,如何设置? TODO 如果打不开太大的文件 拆分为200M的肯定可以打开Find All in CurrentDocument(在当前文档中找到所有) 下载从百度网盘下载从官网下载 主要为了本地看大日志方便,例如几百…...
线上突发:MySQL 自增 ID 用完,怎么办?
线上突发:MySQL 自增 ID 用完,怎么办? 1. 问题背景2. 场景复现3. 自增id用完怎么办?4. 总结 1. 问题背景 最近,我们在数据库巡检的时候发现了一个问题:线上的地址表自增主键用的是int类型。随着业务越做越…...
黑马程序员C++ P1-P40
一.注释和常量 1.多行注释:/*...............*/ ; 单行注释://.............. 2.常量:用于记录程序中不可修改的量 。定义方式:宏常量#define定义在文件上方 ;const修饰变量 3.标识符命名规则:标识符不能是关键字&a…...