【算法-位运算】求数字的补数

文章目录

  • 1. 题目
  • 2. 思路
  • 3. 代码
  • 4. 小结

1. 题目

476. 数字的补数

对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。

  • 例如,整数 5 的二进制表示是 “101” ,取反后得到 “010” ,再转回十进制表示得到补数 2 。

给你一个整数 num ,输出它的补数。

示例 1:

输入: num = 5
输出: 2
解释: 5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。

示例 2:

输入: num = 1
输出: 0
解释: 1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。

提示:

  • 1 <= num < 2^31

2. 思路

这道题的逻辑是数字取反,而不是求补码,那么来看下图图解。
在这里插入图片描述
这里的取反是需要找到最高位的 1 然后取反,所以核心逻辑就是如何找到最高位1,如果要找到最高位 1,有两种方法。

第一种方法就是遍历这个 num 的所有位,找到第一个不为空的位,然后直接 break

int index = -1;
for(int i = 31; i >= 0; i--){
    if(((num >> i) & 1) != 0){
        index = i;
        break;
    }
}

找到这个 index 之后,我们就可以继续遍历从 0 到 index,将这部分数据取反即可。

int res = 0;
for(int i = 0; i <= index; i++){
    if(((num >> i) & 1) == 0){
        res |= (1 << i);
    }
}
return res;

上面这种方法需要遍历所有位,那么有没有更方便的方法呢? 还是看下下面图解。
在这里插入图片描述
上面我们以 57 为例子,最终 x = 32,这个 32 就是我们要找的最高位。我们找到这个最高位 32 后,再将 32 - 1,因为最高位取反后肯定为 0,所以换句话说就是要求出剩下的位里面有哪些位是 1,32 - 1 就是将剩下这些位全部变成 1。
在这里插入图片描述
然后将这个数和 ~num 相与,这样求出来结果了。
在这里插入图片描述


3. 代码

首先是第一种方法,第一种方法就比较简单了,直接遍历即可。

public int findComplement(int num) {
    //1.找到最高位的1,然后从小到大逐位取反
    int index = -1;
    for(int i = 31; i >= 0; i--){
        if(((num >> i) & 1) != 0){
            index = i;
            break;
        }
    }
    int res = 0;
    for(int i = 0; i <= index; i++){
        if(((num >> i) & 1) == 0){
            res |= (1 << i);
        }
    }
    return res;
}

第二种方法,从上面的图解中可以看到核心逻辑就是找到最低位的 1,每一次都相减,那么如何找到最低位 1 呢?这就涉及到位运算公式:x & -x 了。
在这里插入图片描述
上面求出了 -num 的值,那么最后再将 num 和 -num 相与,就能求出最低位了。
在这里插入图片描述
好了,上面求出最低位了,最后直接用 -num & (x - 1)直接相与就能求出取反的结果了,下面给出第二种方法的代码:

public int findComplement(int num) {
    int x = 0;
    for(int i = num; i != 0; i -= lowbit(i)){
        x = i;
    }
    //将num的前x-1位取反,因为前面32-x位都是0,所以不用管
    return ~num & (x - 1);
}

//获取当前字符最低位的1
public int lowbit(int x){
    return x & -x;
}

这种方法的计算次数比第一种方法少了几种计算次数,效率更高。


4. 小结

这是灵神题单位运算的一条,这里就记录下思路和所用到的位运算公式:

  • 求最低位 1:x & -x




如有错误,欢迎指出!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek能下围棋吗?(续)

休息了一下&#xff0c;接着琢磨围棋&#xff0c;其实前面一篇里的规则有个漏洞的&#xff0c;就是邻居关系定义有问题&#xff0c;先回顾一下游戏规则&#xff1a; 游戏规则 定义&#xff1a; 1.数字对&#xff0c;是指两个1到9之间的整数组成的有序集合。可与记为(m,n)&…

[Collection与数据结构] B树与B+树

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

origin如何在已经画好的图上修改数据且不改变原图像的画风和格式

例如我现在的.opju文件长这样 现在我换了数据集&#xff0c;我想修改这两个图表里对应的算法里的数据&#xff0c;但是我还想保留这图像现在的形式&#xff0c;可以尝试像下面这样做&#xff1a; 右击第一个图&#xff0c;出现下面&#xff0c;选择Book[sheet1] 选择工作簿 出…

Workbench 中的热源仿真

探索使用自定义工具对移动热源进行建模及其在不同行业中的应用。 了解热源动力学 对移动热源进行建模为各种工业过程和应用提供了有价值的见解。激光加热和材料加工使用许多激光束来加热、焊接或切割材料。尽管在某些情况下&#xff0c;热源 &#xff08;q&#xff09; 不是通…

Midjourney中的强变化、弱变化、局部重绘的本质区别以及其有多逆天的功能

开篇 Midjourney中有3个图片“微调”&#xff0c;它们分别为&#xff1a; 强变化&#xff1b;弱变化&#xff1b;局部重绘&#xff1b; 在Discord里分别都是用命令唤出的&#xff0c;但如今随着AI技术的发达在类似AI可人一类的纯图形化界面中&#xff0c;我们发觉这样的逆天…

嵌入式知识点总结 ARM体系与架构 专题提升(三)-中断与异常

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.中断与异常有何区别? 2.中断与DMA有何区别&#xff1f; 3.中断能不能睡眠&#xff0c;为什么&#xff1f;下半部能不能睡眠&#xff1f; 4.中断的响应执行流程是什么&#…

Leetcode:541

1&#xff0c;题目 2&#xff0c;思路 用List集合来装字符串其中每k个为一个元素单位我们根据题目意思就可以明白list中偶数位需要反转reverse&#xff0c;奇数保持原样再全部拼接一块最后return tostring 3&#xff0c;代码 import java.util.ArrayList; import java.util.…

CSS 背景与边框:从基础到高级应用

CSS 背景与边框&#xff1a;从基础到高级应用 1. CSS 背景样式1.1 背景颜色示例代码&#xff1a;设置背景颜色 1.2 背景图像示例代码&#xff1a;设置背景图像 1.3 控制背景平铺行为示例代码&#xff1a;控制背景平铺 1.4 调整背景图像大小示例代码&#xff1a;调整背景图像大小…

【机器学习】自定义数据集使用框架的线性回归方法对其进行拟合

一、使用框架的线性回归方法 1. 基础原理 在自求导线性回归中&#xff0c;我们需要先自定义参数&#xff0c;并且需要通过数学公式来对w和b进行求导&#xff0c;然后在反向传播过程中通过梯度下降的方式来更新参数&#xff0c;从而降低损失值。 2. 实现步骤 ① 散点输入 有一…

DeepSeekMoE:迈向混合专家语言模型的终极专业化

一、结论写在前面 论文提出了MoE语言模型的DeepSeekMoE架构&#xff0c;目的是实现终极的专家专业化(expert specialization)。通过细粒度的专家分割和共享专家隔离&#xff0c;DeepSeekMoE相比主流的MoE架构实现了显著更高的专家专业化和性能。从较小的2B参数规模开始&#x…

【ESP32】ESP-IDF开发 | WiFi开发 | UDP用户数据报协议 + UDP客户端和服务器例程

1. 简介 UDP协议&#xff08;User Datagram Protocol&#xff09;&#xff0c;全称用户数据报协议&#xff0c;它是一种面向非连接的协议&#xff0c;面向非连接指的是在正式通信前不必与对方先建立连接&#xff0c; 不管对方状态就直接发送。至于对方是否可以接收到这些数据内…

Oracle Primavera P6自动进行进度计算

前言 在P6 Professional 有一个自动计划计算的选项&#xff0c;很多人不了解该设置如何使用&#xff0c;以及什么时候该启动这项配置。 详情 P6 Professional 默认为非自动进度计算。启用自动选项后&#xff0c;可以快速查看调度更改的效果。 ​ ​ 如图所示&#xff0c;当你…

gesp(C++六级)(6)洛谷:P10109:[GESP202312 六级] 工作沟通

gesp(C六级)&#xff08;6&#xff09;洛谷&#xff1a;P10109&#xff1a;[GESP202312 六级] 工作沟通 题目描述 某公司有 N N N 名员工&#xff0c;编号从 0 0 0 至 N − 1 N-1 N−1。其中&#xff0c;除了 0 0 0 号员工是老板&#xff0c;其余每名员工都有一个直接领导…

冯诺依曼结构和进程概念及其相关的内容的简单介绍

目录 ​编辑 冯诺依曼体系结构 操作系统(Operator System) 进程 引入 基本概念 描述进程-PCB task_ struct内容分类 进程 ID (PID)和查看进程 进程状态: 进程创建: 进程终止: 进程间通信 (IPC): 冯诺依曼体系结构 冯诺依曼体系结构是现代计算机的基础架构&#xf…

松灵机器人 scout ros2 驱动 安装

必须使用 ubuntu22 必须使用 链接的humble版本 #打开can 口 sudo modprobe gs_usbsudo ip link set can0 up type can bitrate 500000sudo ip link set can0 up type can bitrate 500000sudo apt install can-utilscandump can0mkdir -p ~/ros2_ws/srccd ~/ros2_ws/src git cl…

Excel 技巧23 - 在Excel中用切片器做出查询效果(★★★)

本文讲如何在Excel中用切片器做出查询效果。 目录 1&#xff0c;在Excel中用切片器做出查询效果 1-1&#xff0c;Excel 中的切片器是什么&#xff1f; 1-2&#xff0c;用切片器做出查询效果 1&#xff09;&#xff0c;点击任一表格内单元格&#xff0c;按下CtrlA&#xff0…

Python从0到100(八十六):神经网络-ShuffleNet通道混合轻量级网络的深入介绍

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

cmd命令行无法进入D:盘怎么办

我找到了一个方法就是 增加一个/d cd /d d: 如下图,我不仅可以进入d盘符下&#xff0c;还可以访问盘符下的文件夹

万物皆有联系:驼鸟和布什

布什&#xff1f;一块布十块钱吗&#xff1f;不是&#xff0c;大家都知道&#xff0c;美国有两个总统&#xff0c;叫老布什和小布什&#xff0c;因为两个布什总统&#xff08;父子俩&#xff09;&#xff0c;大家就这么叫来着&#xff0c;目的是为了好区分。 布什总统的布什&a…

unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等

目录 1 场景数量 SceneManager.sceneCount 2 直接代码生成新场景 SceneManager.CreateScene 3 场景的加载 3.1 用代码加载场景&#xff0c;仍然build setting里先加入配置 3.2 卸载场景 SceneManager.UnloadSceneAsync(); 3.3 同步加载场景 SceneManager.LoadScene 3.3.…