位运算的那些奇技淫巧

2023-11-16

看完本文,可以顺便解决leetcode以下两个题目:
136.只出现一次的数字(简单)
191.位1的个数(简单)

一、常(装)见(逼)的位操作
先看几个有意思的位操作:

或操作 | 和空格将英文字符转换为小写,小写本身还是小写

(‘a’ | ’ ') = ‘a’
(‘A’ | ’ ') = ‘a’

与操作 & 和下划线将英文字符转换为大写,大写本身还是大写

(‘b’ & ‘’) = ‘B’
(‘B’ & '
’) = ‘B’

n&(n-1) 消除数字 n 的二进制表示中的最后一个 1

异或^和空格进行英文字符大小写互换;判断异号

(‘d’ ^ ’ ') = ‘D’
(‘D’ ^ ’ ') = ‘d’
x^y < 0;异号,否则同号

下面我们从简单开始,一步一步的实现复杂的位运算~

1、判断奇数偶数

看到这个,你肯定觉得很简单,然后随手写下:

if (n % 2 == 0)
{	// 偶数
} else {	// 奇数
}

其实使用位运算,可以这样写

if ( n & 1 == 1)
{
	// 奇数
} else {
	// 偶数
}

因为如果一个二进制表示偶数的话

偶数的最后一位肯定是0;

奇数的最后一位肯定是1;

2、交换两个数字

这个也是很常见的操作,很简单的就可以写下来:

temp = x;
x = y;
y = temp;

但是如果在实际工作中,遇到不借助辅助空间,依旧让你去交换两个数字呢?
这个时候,位运算的优势就体现出来了
位运算实现如下:

x = x^y
y = x^y
x = x^y

看的第一眼,肯定很懵~ 啥玩意儿这是

首先,我们需要知道两个个基础的公式:

n^n =0; 即相同的两个数异或结果是0
n^0 = n;一个数和0异或的结果是本身

所以,上面展开一下,就是

x = x^y
y = x^y^y = x^0 = x
x = x^y = x^y^x = x^x^y = 0^y = y
3、找出没有重复的数字

我们以上面的为基础,即相同的两个数异或结果是0;一个数和0异或的结果是本身
那我们就把这一些数字,遍历一遍,全部异或一下,不就OK了?

4、m的n次方

要求一个数m的n次方,但是不能使用POW函数,如何做?
不要使用 m x m x m x m x m~ 一直乘以n次,太low了;
时间复杂度就是 O(n)

使用阶乘,复杂度可以降低到O(log N)


int pow(int n){
    int sum = 1;
    int tmp = m;
    
    while(n != 0){
    
        if(n & 1 == 1){
            sum *= tmp;
        }
        
        tmp *= tmp;
        n = n >> 1;
    }
    return sum;
}

上述代码要是不理解二进制可能你就看不懂,这里我来举例解释一下

比如,求m的 5次方
我们把5用二进制表示,就是 0101,
从右往左看,第一个1 代表一个m
第二个1代表一个m x m x m x m ;
当二进制的这一位有1的时候,才把该位置代表的累乘的数算上,否则不算,继续看下一位的情况;

5、判断一个数是不是二的指数

如果一个数,是二的指数,那么它的二进制表示,肯定只有一个1
结合上面说到的:n&(n-1) 消除数字 n 的二进制表示中的最后一个 1

问题就好解决了

return (n > 0 ) && (n & (n - 1) == 0) ) ;
6、找出不大于N的最大2的幂指数

假设这个数是 19;
19用二进制表示就是 00010011
我们需要的结果就是 16 ;00010000
也就是 把 0010011,只保留最左边的一个1;
这个思路很简单,就是把最左边的1后面位,全部变成1;然后整体加1;由于加1之后会进位,所以在整体右移一位

在这里插入图片描述
应该怎么最左边的1后面位,全部变成1呢?

n |= n >> 1;
n |= n >> 2;
n |= n >> 4;

n |= n >> 1;
结果是最左边的1和其右边,也会有一个1;11

n |= n >> 2;
结果是最左边的11和其右边,也会有一个11;1111

n |= n >> 4;
结果是最左边的1111和其右边,也会有一个11;11111111

如此这样,后面就都变成1了,然后+1,右移一位就行

二、leetcode解题
136.只出现一次的数字(简单)

这个题刚刚上面说过了,全部都异或
直接上答案;

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        //异或
        int n=nums.size();
        int res=0;
        for(int i=0;i<n;i++)
        {
            res^=nums[i];
        }
        return res;
    }
};

191.位1的个数(简单)

在这里插入图片描述
思路:
只需要记得:
n&(n-1) 消除数字 n 的二进制表示中的最后一个 1


class Solution {
public:
    int hammingWeight(uint32_t n) {
        int res = 0;
        while (n != 0) {
            n = n & (n - 1);
            res++;
        } 
        return res;
    }
};

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

位运算的那些奇技淫巧 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • Git使用方法 与 gitee实战 & sourcetree

    参考 Git教程 廖雪峰的官方网站 版本控制工具 git 1 版本控制 记录一个或者多个文件内容变化 以便于未来查询指定的版本信息 svn 集中式 git 分布式 防止代码的丢失 团队协作 版本还原 更好的管理代码 2 git介绍 用于代码
  • 正则匹配规则

    规则1 优先选择最左端的匹配结果 Rule 1 The Match That Begins Earliest Wins 根据这条规则 起始位置最靠左的匹配结果总是优先于其他可能的匹配结果 这条规则并没有规定优先的匹配结果的长度 稍后将会讨论
  • Java项目本地访问resource目录文件运行正常,打包成jar后提示没有那个文件目录

    本地获取方法代码入下 这种方式得到的路径 打包成jar后会访问不到这个路径 this getClass getClassLoader getResource FONT PATH getPath usr local api fxq contr
  • Android开发环境的搭建

    Android开发环境的搭建 在开始Android开发之旅启动之前 首先要搭建环境 然后创建一个简单的HelloWorld 本文的主题如下 1 环境搭建 1 1 JDK安装 1 2 Eclipse安装 1 3 Android SDK安装 1
  • 生于1999年的11家互联网公司:为何唯独阿里巴巴化茧成蝶?

    1999年 是中国互联网发展史上颇具传奇性的一年 这一年 QQ的前身OICQ横空出世 搜狐和张朝阳风头正劲 李彦宏辞职回京创业 李国庆创立当当 陈天桥创立盛大 马云创立了阿里巴巴 同一起跑线之下 还有携程 中华网 易趣 天涯社区 8848
  • Map 转化为数组

    含义 Map 数据结构类似于对象 也是键值对的集合 但是键的范围不限于字符串 各种类型的值 包括对象 都可以当做键 Map 结构提供了 值 值 的对应 是更完善的 Hash 结构实现 Map 可以作为构造函数 新建 Map new Map
  • python distutils、setuptools打包第三方库

    1 项目目录 src 引用时的包名 可随意修改 http 子类包名 可随意修改 init py xxx py init py xxx py readme md setup py 打包信息 例如上命名方式 打包后引用时为 import src
  • 如何在 Python 中终止 Windows 上运行的进程?

    当深入研究Windows操作系统上的Python开发领域时 无疑会出现需要终止正在运行的进程的情况 这种终止背后的动机可能涵盖多种情况 包括无响应 过度资源消耗或仅仅是停止脚本执行的必要性 在这篇综合性的文章中 我们将探讨各种方法来完成使用
  • 算法二分查找之第一个错误的版本

    java方法 The isBadVersion API is defined in the parent class VersionControl boolean isBadVersion int version public class
  • P-tuning v2 利用深度提示调优

    P tuning v2 利用深度提示调优 即对预训练变压器的每一层输入应用连续提示 Deep prompt tuning 增加了连续提示的能力 并缩小了跨各种设置进行微调的差距 特别是对于小型模型和艰巨的任务 感谢 rainatam 为发布
  • 网络数据保障ptop_智能IP网络,引领广域网进入全业务智能时代

    当前 伴随数字化的浪潮 各行各业都在加速数字化探索和转型 对企业而言 数字化转型的根本是通过对业务模式 业务流程 企业组织的改造 让所有的业务能够基于数据进行驱动 实现更好的客户体验和更高的组织效能 从而推动业务的增长 企业数字化转型的终极
  • 在 BSV 上构建机器学习竞赛市场

    我们提出了一种在 BSV 上实现去中心化机器学习 ML 市场的新方法 任何人都可以通过发布附带奖励的智能合约来外包机器学习任务 任何提交表现最佳模型的人都将通过区块链交易获得奖励 而无需通过中心化机构 如何在 BSV 上进行机器学习竞赛 K
  • 1.2 管理 NetBackup 许可证

    关于管理 NetBackup 许可证 NetBackup许可证密钥是在安装软件时添加的 对于需要单独购买的选件 可以稍 后在 许可证密钥 对话框中添加许可证 注意 在进行任何许可证更新之后 请重新启动 NetBackup 管理控制台 注意
  • Fedora 18 安装VMware Tools

    1 宿主机 windows 8 4G内存 2 虚拟机 VMware 9 0 1 3 虚拟主机 VMware下Fedora 18 1G内存 VMware Tools是VMware虚拟机中自带的一种增强工具 相当于 VirtualBox 中的增
  • ipv6文件服务器,ipv6怎么配置服务器

    ipv6怎么配置服务器 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 IPv6的使用 可以有效弥补IPv4网络地址资源有
  • StrongSORT(deepsort强化版)浅实战+代码解析

    1 实战部分 1 1 具体操作 其实和之前的deepsort没差 到github上下载Yolov5 StrongSORT OSNet 下载对应的yolov5去替代原文件中yolov5 下载yolov5权重 可以自动下载 和ReID权重 可能
  • (Java 基础知识) Java 正则表达式

    一 概述 正则表达式是Java处理字符串 文本的重要工具 Java对正则表达式的处理集中在以下两个两个类 java util regex Matcher 模式类 用来表示一个编译过的正则表达式 java util regex Pattern
  • 编译原理三大经典书籍(龙书 虎书 鲸书)

    1 龙书 Dragon book 英文名 Compilers Principles Techniques and Tools 作者 Alfred V Aho Ravi Sethi Jeffrey D Ullman 中文名 编译原理技术和工具
  • 《python语言程序设计》第5章第10题 里EOFError:EOF when reading a line? 问题的解决(小白分享)

    废话不多说上题 编写程序提示用户输入学生个数以及每个学生的分数 然后显示最高分 假设输入是存储在一个名为score txt的文件 程序从这个文件获取输入 codeNumber eval input Enter class input 输入学
  • 位运算的那些奇技淫巧

    这里写目录标题 一 常 装 见 逼 的位操作 先看几个有意思的位操作 1 判断奇数偶数 2 交换两个数字 3 找出没有重复的数字 4 m的n次方 5 判断一个数是不是二的指数 6 找出不大于N的最大2的幂指数 二 leetcode解题 13