后端常见问题解答-位运算实际场景讲解

位运算

在计算机存储的世界中,一切都是二进制的,位运算就是对二进制位进行操作的一种运算。位运算是计算机中的一种常见运算,可以用来提高性能和提升代码的可读性。

位运算有很多种,比如与、或、非、异或等,这些运算可以用来实现很多高效的算法。在这里,我们根据Bitmap实现密码强度检查器的实例,讲解位运算的实际应用场景。

代码讲解

查看源码

上面的代码中,我们使用Bitmap来表示密码中的字符,然后用位运算来判断是否符合要求。

我们先说清楚Bitmap的构建,我们用一个长度为128的数组来表示ASCII码表中的字符,然后用1 << 1, 1 << 2, 1 << 3, 1 << 4来表示大小写字母、数字、特殊字符,然后用位运算来判断是否符合要求。

那么我们先看一下UPPER_CASE、LOWER_CASE、DIGIT、SPECIAL_CHAR这四个常量:

从上面的图可以看出来,1 << 1 就是2, 对应的二进制表示就是"00000010"

| 或运算

ALL 这个变量UPPER_CASE | LOWER_CASE | DIGIT | SPECIAL_CHAR的或运算:

二进制的或运算是将两个数的二进制表示对应位进行或运算,只要有一个为1,结果就是1,否则就是0。

也就是00000010 | 000000100 | 0000001000 | 00000010000,也就是00000011110 所以ALL就是表示每个位上的状态都是1,也就是密码中包含了大小写字母、数字、特殊字符。

|= 或运算

hints |= currentBit 这个语句是将hints和currentBit进行或运算,然后将结果赋值给hints。 等同于:

hints = hints | currentBit;

就是相当于将hints的每一位和currentBit的每一位进行或运算,然后将结果赋值给hints。

& 与运算

代码中,我们用(currentBit & ALL) == 0来判断是否符合要求,这里用到了与运算。 二进制的与运算是将两个数的二进制表示对应位进行与运算,只有两个数的对应位都是1,结果才是1,否则就是0。

也就是00000010 & 0000001110,也就是00000010, 因为只有第二位是1,其他位都是0。 这个值就不会等于0,就表示当前的字符是符合要求的。

~ 非运算

~ 非运算是将一个数的二进制表示取反,也就是0变成1,1变成0。 也就是~00000010,也就是11111101,这个值就是-3。

配合与运算,可以用来取消hints的某一位, 比如当前是 UPPER_CASE | LOWER_CASE, 我们想取消LOWER_CASE

可以用hints & ~LOWER_CASE来取消LOWER_CASE
也就是00000010 & ~00000100,—> 00000010 & 11111011,—> 00000010
这样就取消了LOWER_CASE

比如:

hints = hints &= ~currentBit;

等同于:

hints = hints & ~currentBit;

^ 异或运算

异或运算是将两个数的二进制表示对应位进行异或运算,只有两个数的对应位不相同,结果才是1,否则就是0。

也就是00000010 ^ 0000001110,也就是000000110, 因为只有第二位是1,其他位都是0。 这个值就不会等于0,就表示当前的字符是符合要求的。

总结
在实际的开发中,我们可以用位运算来实现很多高效的算法,比如Bitmap、布隆过滤器等,这些算法都是基于位运算的,可以提高代码的性能和可读性。

作为后端开发工程师,我们需要了解位运算的基本原理和应用场景,这样才能更好地优化代码,提高系统的性能。

所有的后端面试常见的问题,我们每天都会在我们的编程群里面讨论和Code review, 欢迎大家加入我们的编程群,一起学习和进步。

实战项目交流群

入职啦官方公众号,关注更多面试题分享

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

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

相关文章

Docker中部署Jenkins+Pipline流水线基础语法入门

场景 DockerCompose中部署Jenkins&#xff08;Docker Desktop在windows上数据卷映射&#xff09;&#xff1a; DockerCompose中部署Jenkins&#xff08;Docker Desktop在windows上数据卷映射&#xff09;-CSDN博客 DockerComposeJenkinsPipeline流水线打包SpringBoot项目(解…

Linux时间子系统6:NTP原理和Linux NTP校时机制

一、前言 上篇介绍了时间同步的基本概念和常见的时间同步协议NTP、PTP&#xff0c;本篇将详细介绍NTP的原理以及NTP在Linux上如何实现校时。 二、NTP原理介绍 1. 什么是NTP 网络时间协议&#xff08;英语&#xff1a;Network Time Protocol&#xff0c;缩写&#xff1a;NTP&a…

【docker入门】

在软件开发过程中&#xff0c;环境配置是一个至关重要的步骤&#xff0c;它不仅影响开发效率&#xff0c;也直接关联到软件的最终质量。正确的环境配置可以极大地减少开发中的潜在问题&#xff0c;提升软件发布的流畅度和稳定性。以下是几个关键方面&#xff0c;以及如何优化环…

编写一个简单的Mybatis插件

1.编写一个类&#xff0c;实现Intercepter这个接口 2.完成这个类的方法&#xff0c;并通过注解Intercepts来告诉Mybatis这个插件拦截哪个类和哪个方法 3.在Mybatis的全局配置文件里注册这个插件&#xff0c;让插件生效 4.玩一个实际功能的插件

MySQL 示例数据库大全

前言&#xff1a; 我们练习 SQL 时&#xff0c;总会自己创造一些测试数据或者网上找些案例来学习&#xff0c;其实 MySQL 官方提供了好几个示例数据库&#xff0c;在 MySQL 的学习、开发和实践中具有非常重要的作用&#xff0c;能够帮助初学者更好地理解和应用 MySQL 的各种功…

树莓派4B学习笔记8:开机自启动Python脚本_kill关闭后台脚本

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 紧接着上篇文章学习的串口通信,今日学习如何让树莓派开机…

使用MyBatisPlus让数据库和实体类字段自动映射

文章目录 使用MyBatisPlus让数据库和实体类字段自动映射需求场景假如没有映射把映射放到sql语句中使用MyBatisPlus提供的注解简化映射 使用MyBatisPlus让数据库和实体类字段自动映射 需求场景 数据库表中的字段名字&#xff0c;与实体类中的属性名字不一致&#xff0c;我们想…

【Linux】进程间通信2——命名管道

1. 命名管道(FIFO) 1.1. 基本概念 简单&#xff0c;给匿名管道起个名字就变成了命名管道 那么如何给 匿名管道 起名字呢&#xff1f; 结合文件系统&#xff0c;给匿名管道这个纯纯的内存文件分配 inode&#xff0c;将文件名与之构建联系&#xff0c;关键点在于不给它分配 D…

618数码好物清单,这些好物你不容错过

每次的618大促中&#xff0c;有各类数码产品纷纷亮相&#xff0c;让人眼花缭乱&#xff0c;而且打折的力度都很高&#xff0c;那么在这个充满诱惑的购物季里&#xff0c;哪些电子数码好物值得你入手呢&#xff1f;今天&#xff0c;我就一起给题主盘点那些实用至上、绝对不吃灰的…

RT-Thread-Nano使能动态内存Heap后,程序无法运行

RT-Thread-Nano移植 1. 动态内存堆1.1 问题1.2 解决 3. 问题根源 1. 动态内存堆 1.1 问题 按照官方文档&#xff1a;在 RT-Thread Studio 上使用 RT-Thread Nano&#xff0c;新建nano工程后&#xff0c;可以正常运行。 但是开启内存管理后&#xff0c;系统无法正常启动&…

Docker高级篇之轻量化可视化工具Portainer

文章目录 1. 简介2. Portainer安装 1. 简介 Portianer是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便管理Docker环境&#xff0c;包括单机环境和集成环境。 2. Portainer安装 官网&#xff1a;https://www.portainer.io 这里我们使用docker命令安装&…

三分钟了解链动3+1模式

在电商领域的营销策略中&#xff0c;链动31模式以其独特的魅力和优势&#xff0c;吸引了众多商家的目光。下面&#xff0c;我们将对这一模式进行深度剖析&#xff0c;并探讨其相较于链动21模式的优势所在。 一、身份设置与奖励机制 链动31模式在身份设置上分为三种&#xff1…

C#观察者模式应用

目录 一、什么是观察者模式 二、C#中观察者模式的实现 三、两种实现的用法 1、事件与委托 2、IObserver和IObservable 四、参考文献 一、什么是观察者模式 观察者&#xff08;Observer&#xff09;模式的定义&#xff1a;指多个对象间存在一对多的依赖关系&#xff0c;当…

C++: shared_ptr是线程安全的吗

导读 C面试中有时会有这样一个问题&#xff0c;shared_ptr是线程安全的吗&#xff1f;对此问题&#xff0c;我们需要从三个并发场景进行考虑&#xff0c;拷贝shared_ptr的安全性、对shared_ptr赋值的安全性和读写shared_ptr指向内存区域的安全性。 对于以上问题&#xff0c;首…

python flask配置数据库并进行orm操作 flask_sqlalchemy

&#x1f308;所属专栏&#xff1a;【Flask】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…

Java——IO流(一)-(4/8):前置知识-字符集、UTF-8、GBK、ASCII、乱码问题、编码和解码等

目录 常见字符集介绍 标准ASCII字符集 GBK&#xff08;汉字内码扩展规范&#xff0c;国标&#xff09; Unicode字符集&#xff08;统一码&#xff0c;万国码&#xff09; 小结 字符集的编码、解码操作 方法 实例演示 常见字符集介绍 标准ASCII字符集 ASCll(American St…

YOLOv10改进 | 注意力篇 | YOLOv10改进CA注意力机制

1.CA介绍 摘要:最近关于移动网络设计的研究已经证明了通道注意力(例如,挤压和激励注意力)对于提升模型性能的显着有效性,但它们通常忽略了位置信息,而位置信息对于生成空间选择性注意力图很重要。 在本文中,我们通过将位置信息嵌入到通道注意力中,提出了一种新颖的移动…

伊拉克目的港清关严控,所有管控范围内的产品务必申请COC证书

伊拉克目的港清关严控&#xff0c;所有管控范围内的产品务必申请COC证书&#xff0c;COC/COI 伊拉克使馆认证&#xff0c;欢迎随时咨询小詹 近期&#xff0c;伊拉克海关扩大了进口产品管控品类&#xff0c;从产品的12大类700多种商品拓宽到800多种商品&#xff0c; 伊拉克海关…

Nature发文介绍使用ChatGPT帮助学术写作的三种方式

文章链接&#xff1a;https://www.nature.com/articles/d41586-024-01042-3 一、介绍 这篇文章是由Dritjon Gruda撰写的&#xff0c;讨论了生成性人工智能&#xff08;AI&#xff09;在学术写作、编辑和同行评审中的三种应用方式。Gruda认为&#xff0c;尽管学术界对聊天机器…

Ubuntu-24.04-live-server-amd64安装界面中文版

系列文章目录 Ubuntu安装qemu-guest-agent Ubuntu-24.04-live-server-amd64启用ssh Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、准备工作二、开始安装三、测试效果总结 前言 Centos结束&#xff0c;转战Ubuntu。我之所以写这篇文章&#xff0c;是因为我…