【面试经典150 | 】颠倒二进制位

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:逐位颠倒
    • 方法二:分治
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【位运算】


题目来源

190. 颠倒二进制位


题目解读

将给定的 32 位无符号整数的二进制位进行颠倒。


解题思路

方法一:逐位颠倒

n 是一个 32 位的二进制数,我们从低位到高位枚举每一位,将其放置到答案 res 的合适位置。比如 n 的二进制位的第 i 位(从低位往高位数)放置到 res 的第 31 - i 位。当前枚举的比特位为当前 n & 1,在枚举完成当前位后,更新 n >>= 1 为下一个枚举做准备。

实现代码

class Solution {
public:uint32_t reverseBits(uint32_t n) {uint32_t ans = 0;for(int i = 0; i < 32; ++i){int lst = n & 1;lst <<= (31-i);ans |= lst;n >>= 1;}return ans;}
};

复杂度分析

时间复杂度: O ( l o g n ) O(logn) O(logn)

空间复杂度: O ( 1 ) O(1) O(1)

方法二:分治

还有一种分治的方法来实现 32 位无符号整数的二进制数颠倒。分治法又分为两种:

  • 自上而下;
  • 自下而上。

我们先来看一下自上而下进行分治,自上而下,首先对二进制数每 16 位为一组进行交换,接着是每 8 位一组交换、4 位一组交换、2 位一组交换直至 1 位二进制数为一组进行交换。通过这样的交换之后,就可以实现 32 位无符号整数的二进制数颠倒

怎么实现 16 位二进制数一组进行交换呢?通过位运算啊,将 n 右移 16 位,那么 n 将只会保留高位的 16 位;将 n 左移 16 位,那么 n 将只会保留低位的 16 位; (n >> 16) | (n << 16) 就完成了第一步的 “对二进制数每 16 位为一组进行交换”。

如图所示,我们以 8 位为一组进行交换,n & 0x00ff00ff 就可以得到 1 组和 3 组位置的 8 位二进制数,我们再对 n & 0x00ff00ff 左移八位,就将 1 组和 3 组位置的 8 位二进制数移动到了 0 组和 2 组。我们现将 n 左移 8 位,然后与上 0x00ff00ff 就将 0 组和 2 组位置的 8 位二进制数移动到了 1 组和 3 组。最后将这两种操作或上就完成了以 8 位为一组进行交换。

类似的可以完成以 4、2、1 为一组的交换操作。

以上遍历自上而下的分治方法。自下而上的分治操作就是先以 1 为一组进行交换,然后再分别以 2、4、16 为一组进行交换。需要注意的是每种交换单位对应需要与上的二进制数。

以下代码给出的是自下而上的分治代码,自上而下的分治代码就是自下而上的分治代码顺序颠倒过来。方法二也是 【进阶】的解决方案。

实现代码

class Solution {
private:const uint32_t M1 = 0x55555555;const uint32_t M2 = 0x33333333;const uint32_t M4 = 0x0f0f0f0f;const uint32_t M8 = 0x00ff00ff;
public:uint32_t reverseBits(uint32_t n) {n = n >> 1 & M1 | (n & M1) << 1;n = n >> 2 & M2 | (n & M2) << 2;n = n >> 4 & M4 | (n & M4) << 4;n = n >> 8 & M8 | (n & M8) << 8;return n >> 16 | n << 16;}
};

复杂度分析

时间复杂度: O ( 1 ) O(1) O(1)

空间复杂度: O ( 1 ) O(1) O(1)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/186194.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程基础知识

目录 进程 线程 CPU 核心数和线程数的关系 上下文切换(Context switch) Thread 和 Runnable 的区别 Callable、Future 和 FutureTask 面试题:新启线程有几种方式? 中止 中断 深入理解 run()和 start() 进程 我们常听说的是应用程序&#xff0c;也就是 app&#xff…

使命担当 守护安全 | 中睿天下获全国海关信息中心感谢信

近日&#xff0c;全国海关信息中心向中睿天下发来感谢信&#xff0c;对中睿天下在2023年网络攻防演练专项活动中的大力支持和优异表现给予了高度赞扬。 中睿天下对此次任务高度重视&#xff0c;紧密围绕全国海关信息中心的行动要求&#xff0c;发挥自身优势有效整合资源&#x…

Vue3中使用Pinia

前言&#xff1a; 在 Vue 3 中&#xff0c;Pinia 是一个用于管理全局状态的库。它可以让我们更容易地维护和共享应用的状态。下面是如何在 Vue 3 中使用 Pinia 的步骤。 正文&#xff1a; 首先&#xff0c;我们需要安装 Pinia。可以使用 npm 或者 yarn 来安装。例如&#xff0…

【Unity ShaderGraph】| 如何快速制作一个炫酷的 全息投影效果

前言 【Unity ShaderGraph】| 如何快速制作一个炫酷的 全息投影效果一、效果展示二、 全息投影效果 前言 本文将使用ShaderGraph制作一个 炫酷的 全息投影效果 &#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xff1a;【Unity Shader…

Docker学习——④

文章目录 1、Docker Image&#xff08;镜像&#xff09;2、镜像命令详解2.1 docker rmi2.2 docker save2.3 docker load2.4 docker image inspect2.5 docker history2.6 docker image prune 3、镜像综合实战3.1 离线镜像迁移3.2 镜像存储的压缩与共享 1、Docker Image&#xff…

创建多层级行索引,创建多层级行索引的DataFrameMultiIndex.from_product()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 创建多层级行索引, 创建多层级行索引的DataFrame MultiIndex.from_product() [太阳]选择题 使用pd.MultiIndex.from_product()&#xff0c;下列输出正确的是&#xff1a; import pandas as pd…

C++打怪升级(十)- STL之vector

~~~~ 前言1. vector 是什么2. 见见vector的常用接口函数吧构造函数无参构造函数使用n个val构造拷贝构造使用迭代器范围构造初始化形参列表构造 析构函数赋值运算符重载函数元素访问[]运算符重载函数访问at函数访问front函数back函数 迭代器相关正向迭代器反向迭代器 容量相关si…

C# OpenCvSharp 玉米粒计数

效果 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter "*.*|*.bmp;…

【NLP】特征提取: 广泛指南和 3 个操作教程 [Python、CNN、BERT]

什么是机器学习中的特征提取&#xff1f; 特征提取是数据分析和机器学习中的基本概念&#xff0c;是将原始数据转换为更适合分析或建模的格式过程中的关键步骤。特征&#xff0c;也称为变量或属性&#xff0c;是我们用来进行预测、对对象进行分类或从数据中获取见解的数据点的…

JAVA微信端医院3D智能导诊系统源码

医院智能导诊系统利用高科技的信息化手段&#xff0c;优化就医流程。让广大患者有序、轻松就医&#xff0c;提升医疗服务水平。 随着人工智能技术的快速发展&#xff0c;语音识别与自然语言理解技术的成熟应用&#xff0c;基于人工智能的智能导诊导医逐渐出现在患者的生活视角中…

java--String

1.String创建对象封装字符串数据的方式 ①方式一&#xff1a;java程序中的所有字符串文字(例如"abc")都为此类的对象 ②方式二&#xff1a;调用String类的构造器初始化字符串对象。 2.String提供的操作字符串数据的常用方法

docker部署mongodb

1&#xff1a;拉去momgodb镜像 2&#xff1a;拉去成功后&#xff0c;通过docker-compose.yml配置文件启动mongodb&#xff0c;docker-compose.yml配置如下 version: 3.8 services:mongodb-1:container_name: mongodbimage: mongo ports:- "27017:27017"volumes:- G:…

计网----累积应答,TCP的流量控制--滑动窗口,粘包问题,心跳机制,Nagle算法,拥塞控制,TCP协议总结,UDP和TCP对比,中介者模式

计网----累积应答&#xff0c;TCP的流量控制–滑动窗口&#xff0c;粘包问题&#xff0c;心跳机制&#xff0c;Nagle算法&#xff0c;拥塞控制&#xff0c;TCP协议总结&#xff0c;UDP和TCP对比&#xff0c;中介者模式 一.累积应答 1.什么是累计应答 每次发一些包&#xff0…

前端构建工具vite与webpack详解

文章目录 前言什么是构建工具先说说企业级项目里都需要具备哪些功能&#xff1f;这是代码改动后需要做的事情样例总结 一、构建工具他到底承担了哪些脏活累活&#xff1f;二、vite相较于webpack的优势三、 vite会不会取代webpack四、 你必须要理解的vite脚手架和vitecreate-vit…

虚幻引擎:如何在工程里面添加插件

1.在自己的项目中安装插件 在content目录下创建一个Plugins的文件,将插件文件放进去即可 2.在软件上安装,这样所有创建的项目都会带有此插件 将插件放在自己软件的这个目录下就好了

Linux 多线程编程详解

目录 为什么要使用多线程 线程概念 线程的标识 pthread_t 线程的创建 向线程传入参数 线程的退出与回收 线程主动退出 线程被动退出 线程资源回收(阻塞方式) 线程资源回收(非阻塞方式) 为什么要使用多线程 在编写代码时&#xff0c;是否会遇到以下的场景会感觉到难以…

后期混音效果全套插件Waves 14 Complete mac中文版新增功能

Waves 14 Complete for Mac是一款后期混音效果全套插件&#xff0c;Waves音频插件,内置混响&#xff0c;压缩&#xff0c;降噪和EQ等要素到建模的模拟硬件&#xff0c;环绕声和后期制作工具&#xff0c;包含全套音频效果器&#xff0c;是可以让你使用所有功能。Waves 14 Comple…

Vue3全局共享数据

目录 1&#xff0c;Vuex2&#xff0c;provide & inject2&#xff0c;global state4&#xff0c;Pinia5&#xff0c;对比 1&#xff0c;Vuex vue2 的官方状态管理器&#xff0c;vue3 也是可以用的&#xff0c;需要使用 4.x 版本。 相对于 vuex3.x&#xff0c;有两个重要变…

微信小程序电商审核模版

《电商平台服务协议》与交易规则 下载链接 电商平台对入驻经营者的审核要求或规范文件 下载链接 电商平台对用户交易纠纷处理的机制或方案 下载链接 打包下载&#xff1a;https://download.csdn.net/download/nicepainkiller/88519604https://download.csdn.net/download/nicep…

拓世科技集团打造数字人营销解决方案,为车企提供新的“增长担当”

汽车&#xff0c;已经渐渐融入了现代人的日常生活&#xff0c;从高端的身份标志转变为普罗大众的出行选择&#xff0c;它驶入了千家万户&#xff0c;成为了我们日常出行的可靠伙伴&#xff0c;见证着人们的生活故事和时代的变迁。 中国汽车市场的蓬勃发展引起了业内外的广泛关…