名称Doubletful的博客算法专栏签名路漫漫其修远兮吾将上下而求索文章目录前言一、二进制计算简介1.二进制操作符1.1.位操作符1.2.移位操作符2.进制转换二、题目解法一 操作符遍历统计解法二Brian Kernighan 算法遍历统计解法三掩码分治统计三、总结四、练习前言在数字世界的底层万物皆为二进制当我们比较两个整数时一个有趣的度量方式不是看它们数值差多少而是看它们在二进制形态下“长得有多不像”这种度量在信息论中被称为汉明距离。文章概述本文将使用 c 语言通解 LeetCode 题目461. 汉明距离。将提供三种逐步优化的解法使时间复杂度缩短至 O(1)。提供基础位运算简介以便初学者阅读可跳过。一、二进制计算简介1.二进制操作符1.1.位操作符按位与 按照对应的二进制位进行与运算同时为1才为1二进制例1100 0011 00001010 1000 1000。按位或 |按照对应的二进制位进行或运算同时为0才为0二进制例1100 | 0011 11111010 | 1000 1010。按位异或 ^按照对应的二进制位进行异或运算相同为0相异为1二进制例1100 ^ 0011 11111010 ^ 1000 0010。按位取反 ~按照对应的二进制位进行取反运算将0和1互换二进制例~1100 0011~1010 0101~1000 0111。1.2.移位操作符左移操作符 语法为被移动整数 移动位数规则是左边丢弃右边填充0。二进制例00011000 1 00110000。右移操作符 语法为被移动整数 移动位数规则分为两种情况逻辑右移和算术右移大部分编译器采用算术右移。逻辑右移左边填充0右边丢弃。算术右移左边用该值的符号位填充右边丢弃。二进制例00011000 1 00001100。注位操作符和移位操作符都只能对整数进行操作。2.进制转换⇒二进制转八进制从二进制的低位开始每3个二进制位转换为一个八进制位剩余直接转化。例二进制为 10111八进制为 27十进制为 23。⇒二进制转十六进制从二进制的低位开始每4个二进制位转换为一个十六进制位剩余直接转化。例二进制为 1010011十六进制为 53十进制为 83。接下来是正题部分二、题目先看题目我们被要求计算两个 32 位整数的汉明距离即 x 与 y 不同二进制位的个数。解法一 操作符遍历统计首先计算 x ^ y。异或运算的本质是“相同为0不同为1”因此新 x 的二进制表示中有多少个 1就代表原数有多少个不同的位。利用 操作符遍历 x 的每一位并使用 操作符判断 x 的每一位是否为 1 记录不同位的个数。解法二Brian Kernighan 算法遍历统计有一个极其巧妙的位运算性质n (n - 1) 的结果会将 n 的二进制中最右边的 1 变为 0图例如下设有一个二进制数为 10000当这个数减 1 时结果是 0111110000 01111 正好等于 0因为每次减 1 都会使二进制数上最右边的 1 退位使在该数位前的全 0 位变为全 1 位并将该数位变为 0 操作正好就将减 1 前的二进制数与减 1 后的二进制数有 1 的位全部对应有 0 的位抹除最右边的 1。解法三掩码分治统计这是本篇文章的重头戏也是计算机底层架构如 CPU 指令 POPCNT实现统计 1 个数的数学原理。它不再依赖循环而是通过二分法将位数累加。初看代码会非常奇怪这些十六进制数代表什么意思为什么 x 要 这些数后又将 x 右移并再次 它们为什么这样就能计算新 x 中为 1 的二进制位个数了——我们逐步拆解先看这些十六进制数代表什么一个十六进制位等于四个二进制位将这些十六进制数转换为二进制后0x55555555 0101 0101 0101 0101 0101 0101 0101 01010x33333333 0011 0011 0011 0011 0011 0011 0011 00110x0f0f0f0f 0000 1111 0000 1111 0000 1111 0000 11110x00ff00ff 0000 0000 1111 1111 0000 0000 1111 11110x0000ffff 0000 0000 0000 0000 1111 1111 1111 1111可以观察到有一定规律它们的二进制特征分别是0x55555555单个位交替用于隔离相邻的奇偶位0x33333333两位交替用于隔离相邻的 4 位中的低 2 位0x0F0F0F0F四位交替用于隔离相邻的 8 位中的低 4 位0x00FF00FF八位交替用于隔离相邻的 16 位中的低 8 位0x0000FFFF 十六位交替用于隔离高 16 位和低 16 位这些位中的 0 都用于隔离1 都用于保留计算0x55555555 的作用有些特殊它先以每 1 位统计 x 中 1 的个数并将个数存储进对应的两位中也就是先转换将代表 x 与 y 在哪一位不同的 1 转换为以每两位分隔的实际不同位的数量注意该意义转换目前只在每两位中生效。而除 0x55555555 以外的值都在做被分隔的实际不同位数量的合并操作最终合并为 32 位表示的实际不同位数量也就是正确的十进制表示。 运算、 运算与加法解读在理解了这些数字在代码中的作用后再看 x 分别直接进行 运算和 x 先右移再进行 运算就非常通俗易懂了如下所示❇️2 位一组将 x 分为每 2 位一组计算每组中 1 的个数。x 0x55555555 取出奇数位的 1右移后取出偶数位的 1二者相加结果以二进制形式保存在原来的 2 位空间中。❇️4 位一组将上一步的结果每 4 位一组计算每组中 1 的个数。x 0x33333333 先取出前两位的个数右移后再取出后两位的个数最后相加结果以二进制形式保存在原来的 4 位空间中。……………………❇️归并到 32 位最终得到整个 32 位整数中 1 的总数。三、总结通过这道经典的汉明距离题目我们清晰地看到了算法演进的三个层次解法核心思想优点缺点解法一逐位右移检查直观易懂符合第一反应固定循环 32 次存在冗余操作解法二清除最低位的 1循环次数仅与 1 的个数有关实战效率高依然依赖循环无法利用现代 CPU 并行特性解法三二进制并行加法树状归并无分支、无循环性能极致体现了位运算的数学之美可读性较差需要深刻理解二进制分治原理四、练习推荐手动在LeetCode网站上实现三种解法461. 汉明距离 链接link.⚛️EL PSY CONGROO十分感谢你的阅读本期不确定是否应该添加掩码分治统计执行图例
科大讯飞六麦语音模块 Linux SDK 部署:从 APPID 申请到 udev 规则配置的 8 个关键步骤 科大讯飞六麦语音模块 Linux SDK 深度部署指南:从硬件配置到智能交互全流程1. 六麦阵列技术解析与开发环境搭建环形六麦阵列作为当前远场语音交互的核心硬件,其技术原理基于波束成形和声源定位两大核心技术。科大讯飞XFM10621模块采用6个数字麦克风呈环形…
支付逻辑漏洞防御:5 项后端校验策略与 3 个真实代码修复案例 支付逻辑漏洞防御:5 项后端校验策略与 3 个真实代码修复案例在数字化支付日益普及的今天,支付系统的安全性直接关系到企业的经济利益和用户信任。然而,许多系统在设计支付流程时,往往过于依赖前端验证而忽视了后端的关键校验&…
YOLOv6模型高效转换昇腾OM格式实战指南 1. 项目背景与核心目标最近在部署YOLOv6模型到昇腾310边缘设备时,遇到一个典型需求:如何将PyTorch训练的YOLOv6模型高效转换为昇腾专用格式(OM),并确保推理精度损失控制在千分之一以内。这个需求在工业质检、安防监控等…
谷歌 Made By Google 发布会官宣!Pixel 11 彻底终结 128GB:为何 AI 时代“256GB 起步”成了硬红线? 引言:在智能手机行业中,谷歌的 Made By Google 年度发布会向来被视为 Android 宇宙的“风向标”与“阅兵式”。7月8日最新消息,谷歌官方正式官宣:将于美国东部时间 8月12日18点在纽约 举办 Made By Google 硬件新品发布会…
野外也能做分子检测?松材线虫检测仪器让森防工作更轻松! 作为摧毁松林生态的头号隐患,松材线虫被称作“松树癌症”,传播隐蔽、发病迅猛,一旦扩散极易造成连片松林枯死。以往林业分子检测门槛极高,精密检测设备笨重繁杂,只能运回实验室化验,送检周期长、流程繁琐&a…
机器人时间同步实操(01概念篇) 系列文章目录 文章目录 前言 将分六个板块来介绍此内容。 一、概念篇:什么是网络时间协议(NTP)? 核心定义 网络时间协议(NTP)是用于计算机网络中同步时钟的核心协议。通过客户端-服务器模式,…
ngx_http_charset_header_filter 1 定义 ngx_http_charset_header_filter 函数 定义在 src/http/modules/ngx_http_charset_filter_module.cstatic ngx_int_t ngx_http_charset_header_filter(ngx_http_request_t *r) { ngx_int_t charset, source_charset;ngx_str_t …
Day19智能体测开Python 高阶函数# 高阶函数高阶函数可以对集合、元组或列表的每个元素进行操作,生成一个新的集合、元组或列表返回 map(函数,列表) filter(函数,列表) sorted(列表)# map(函数,列表):将列表的单个元素,逐个作为函数的参数传入…
【大数据毕业设计】基于分布式大数据的养老院服务质量分析系统的设计与实现 基于 Hadoop 的养老院入住数据挖掘与研判系统(源码+文档+远程调试,全bao定制等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…
Unity WebGL部署Apache Tomcat:MIME配置、Gzip压缩与缓存优化实战 1. 项目概述:当Unity WebGL遇上Apache Tomcat如果你是一名Unity开发者,想把精心制作的WebGL游戏或应用部署到自己的服务器上,那么Apache Tomcat大概率是你绕不开的一环。这不仅仅是把一堆构建出来的文件扔进一个文件夹那么简单。我见过太多项…
掌握Docker多阶段构建镜像优化技巧 掌握Docker多阶段构建镜像优化技巧在容器化技术日益普及的今天,Docker已成为开发与运维领域的基石工具。然而,随着应用复杂度提升,构建出的Docker镜像体积庞大、层数繁多、安全性欠佳等问题逐渐凸显,直接影响着部署效率、传输速度…
Ansible的AWX与作业模板调度 在当今快速迭代的IT运维与开发领域,自动化已成为提升效率、保障一致性的核心支柱。Ansible作为一款强大的IT自动化工具,以其无代理、简单易用的特点广受欢迎。而AWX,作为Ansible上游项目提供的企业级Web界面、API及任务引擎,则将A…
3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略 3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾为Windows右键菜单中那些…
GXDE OS下Wayland兼容性实战:从deepin-mutter原理到VMware Tools修复 如果你正在用 GXDE OS 或者任何基于 Deepin 的发行版,并且遇到了“检测到窗口系统采用 Wayland 协议,程序即将退出”这类弹窗,或者发现 VMware Tools 在 Ubuntu 24.04 这类默认 Wayland 的系统上启动失败,那这篇文章就是为你准备的…
企业AI落地困境与AgenticOps实践指南 1. 企业AI落地的现实困境与破局之道过去两年,大模型技术呈现爆发式增长,从GPT-3到GPT-4,从LLaMA到DeepSeek,模型参数规模从百亿级跃升至万亿级,多模态能力从单一文本扩展到图文音视频的综合处理。然而在企业应用层面&a…
[C++]内存管理:串顺序存储的内存回收 在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比 移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建 本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…