大一计算机的自学总结:位运算的应用及位图

前言

不仅异或运算有很多骚操作,位运算本身也有很多骚操作。(尤其后几个题,太逆天了)

一、2 的幂

class Solution {
public:bool isPowerOfTwo(int n) {return n>0&&n==(n&-n);}
};

 根据二进制表示数的原理,2的幂的二进制只有1个1,所以根据Brian算法取最右侧的1,只要n等于取完最右侧1的数,即为2的幂。

二、3 的幂

class Solution {
public:bool isPowerOfThree(int n) {return n>0&&1162261467%n==0;}
};

 1162261467就是整型范围内3的幂的最大值,所以只要n能整除它,就说明n为3的幂。

三、数字范围按位与

class Solution {
public:int rangeBitwiseAnd(int left, int right) {while(left<right){right-=right&(-right);}return right;}
};

 思考与运算的性质,只要有0就是0,又想到连续的区间内,相邻两个数的最右侧1的那位必然不同,所以与运算后最右侧的1必然留不下,所以只要在大于左侧的范围内,每次减去取完最右侧1的数即可。

这么说肯定很抽象很难理解,比如right为0101001101,则right-1为0101001100,所以与运算后最右侧的1肯定留不下,所以减去1,right为0101001100,此时right-1为0101001011,所以第三位的1也留不下,所以right要减去2的平方,成为0101001000,之后若right大于left就继续循环。

四、颠倒二进制位

class Solution {
public:uint32_t reverseBits(uint32_t n) {n=((n&0xaaaaaaaa)>>1)|((n&0x55555555)<<1);n=((n&0xcccccccc)>>2)|((n&0x33333333)<<2);n=((n&0xf0f0f0f0)>>4)|((n&0x0f0f0f0f)<<4);n=((n&0xff00ff00)>>8)|((n&0x00ff00ff)<<8);n=(n>>16)|(n<<16);return n;}
};

 这个和下一个题的思路太过于逆天了。

简单说,就是每次以1,2,48,16为单位进行逆序。例如,abcdefgh先以1为单位逆序成badcfehg;再以2为单位逆序成dcbahgfe;再以4为单位逆序成hgfedcba。

具体原理就是这样,实现起来就是先让abcdefgh&10101010成为a0c0e0g0,再让abcdefgh&01010101成为0b0d0f0h,之后让第一个数右移1位第二个数左移1位,最后或运算就是badcfehg。而10101010就是十六进制aa,01010101就是十六进制55。

之后递推就行。(累)

五、汉明距离

class Solution {
public:int hammingDistance(int x, int y) {return cntOnes(x^y);}int cntOnes(int n){n=(n&0x55555555)+((n>>1)&0x55555555);n=(n&0x33333333)+((n>>2)&0x33333333);n=(n&0x0f0f0f0f)+((n>>4)&0x0f0f0f0f);n=(n&0x00ff00ff)+((n>>8)&0x00ff00ff);n=(n&0x0000ffff)+((n>>16)&0x0000ffff);return n;}
};

 这个的思路和上一个题差不多。

比如,11111001,先保留奇数位的信息,&01010101得到01010001;再获取偶数位的信息,让11111001右移1位后&01010101,得到01010100;最后让两数相加得到10100101,表示从左到右,前两位中有两个1,往后两位2个,之后1个,最后两位1个1。

之后以此类推。

六、位图

1.原理

一般来说,如果要记录出现过的数字,我们一般会向数组中输入这个数表示这个数出现过。但这样的话每个数字都会占用一个int的内存。所以,为了进一步节省内存,就可以使用位图。位图就是在一个位置上,通过这个数32位的二进制,用0和1分别表示出现与否,用位数0~31表示数字0~31。这样的话,一个int的位置就可以表示32个数字。

2.实现——设计位集

class Bitset {vector<int>bitset;bool reverse;int ones;int zeros;int n;public:Bitset(int size) {for(int i=0;i<size;i++){bitset.push_back(0);}reverse=false;ones=0;zeros=size;n=size;}void fix(int idx) {if(!reverse){if((bitset[idx/32]&(1<<(idx%32)))==0){zeros--;ones++;bitset[idx/32]|=(1<<(idx%32));}}else{if((bitset[idx/32]&(1<<(idx%32)))!=0){zeros--;ones++;bitset[idx/32]^=(1<<(idx%32));}}}void unfix(int idx) {if(!reverse){if((bitset[idx/32]&(1<<(idx%32)))!=0){zeros++;ones--;bitset[idx/32]^=(1<<(idx%32));}}else{if((bitset[idx/32]&(1<<(idx%32)))==0){zeros++;ones--;bitset[idx/32]|=(1<<(idx%32));}}}void flip() {reverse=!reverse;int t=ones;ones=zeros;zeros=t;}bool all() {return ones==n;}bool one() {return ones>0;}int count() {return ones;}string toString() {string s;for(int i=0,num;i<n;i++){num=(bitset[i/32]&(1<<(i%32)))==0?0:1;num^=(reverse?1:0);s+=num+'0';}return s;}
};

 重点是全局变量ones和zeros以及reverse,用来记录0和1的数量以及是否经历反转。

在加入中,若没反转过,即0表示没有,1表示有。那么若该位为0,则或运算成为1,并同步让zeros--,ones++。之后反转过的和删除思路相似。

之后反转函数只要将reverse取反,然后交换zeros和ones。

判断是否全为1、判断是否存在1和计算1的数量函数只要对ones操作即可。

转成字符串函数,按位的数量遍历,每次取出该位的数num,若经过反转,则反转num。

总结

位运算这几个例题的思路一个比一个逆天,一个比一个抽象,但用出来确实很nb。(晕)

END

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

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

相关文章

python——Django 框架

Django 框架 1、简介 Django 是用python语言写的开源web开发框架&#xff0c;并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能…

(开源)基于Django+Yolov8+Tensorflow的智能鸟类识别平台

1 项目简介&#xff08;开源地址在文章结尾&#xff09; 系统旨在为了帮助鸟类爱好者、学者、动物保护协会等群体更好的了解和保护鸟类动物。用户群体可以通过平台采集野外鸟类的保护动物照片和视频&#xff0c;甄别分类、实况分析鸟类保护动物&#xff0c;与全世界各地的用户&…

DeepSeek R1学习

0.回顾&#xff1a; https://blog.csdn.net/Together_CZ/article/details/144431432?ops_request_misc%257B%2522request%255Fid%2522%253A%25226574a586f0850d0329fbb720e5b8d5a9%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id…

25美赛ABCDEF题详细建模过程+可视化图表+参考论文+写作模版+数据预处理

详情见该链接&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 25美国大学生数学建模如何准备&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;-CSDN博客文章浏览阅读791次&#xff0c;点赞13次&#xff0c;收藏7次。通过了解比赛基本…

【Qt】多线程

多线程 QThread 类简介使用线程线程同步互斥锁 QThread 类简介 一个 QThread 类的对象管理一个线程。在设计多线程程序的时候&#xff0c;需要从 QThread 继承定义线程类&#xff0c;并重新定义 QThread 的虚函数 run()&#xff0c;在函数 run() 里处理线程的事件循环。 应用…

微服务(一)

文章目录 项目地址一、微服务1.1 分析User的Domian Verb和Nouns 二、运行docker和k8s2.1 Docker1. 编写dockerfile2. 创建docker image3. 运行docker使用指定端口4. 查看当前运行的镜像5. 停止当前所有运行的docker6. 删除不用的docker images7. 将本地的image上传到hub里 2.2 …

软件架构的演变:从大型机和整体式应用到分布式计算

注&#xff1a;本文为 “软件架构演变” 相关文章合辑。 英文引文机翻&#xff0c;未校。 Evolution of Software Architecture: From Mainframes and Monoliths to Distributed Computing Liv Wong Technical Writer August 06, 2024 Software architecture—the blueprint…

求解旅行商问题的三种精确性建模方法,性能差距巨大

文章目录 旅行商问题介绍三种模型对比求解模型1决策变量目标函数约束条件Python代码 求解模型2决策变量目标函数约束条件Python代码 求解模型3决策变量目标函数约束条件Python代码 三个模型的优势与不足 旅行商问题介绍 旅行商问题 (Traveling Salesman Problem, TSP) 是一个经…

机器学习(三)

一:Logistic Regression(逻辑回归): 1,定义:是一种常用的分类算法&#xff0c;适用于二进制分类问题(binary classification)&#xff0c;输出结果的取值范围为[0,1]&#xff0c;且最终拟合出来的图像是一条S型曲线 2,sigmoid function/logistic function(逻辑函数)&#xff1a…

DFS深度优先搜索

蓝桥杯备赛日记——DFS基础 1.DFS剪枝 OJ2942 数字王国之军训排队 思路 写一个dfs函数&#xff0c;这个dfs函数有两个参数&#xff0c;dep和i&#xff0c;dep表示第dep位同学&#xff0c;i表示打算把所有人分成i支队伍&#xff0c;这个函数的功能是来检测是否能把所有同学分…

C语言自定义数据类型详解(二)——结构体类型(下)

书接上回&#xff0c;前面我们已经给大家介绍了如何去声明和创建一个结构体&#xff0c;如何初始化结构体变量等这些关于结构体的基础知识。下面我们将继续给大家介绍和结构体有关的知识&#xff1a; 今天的主题是&#xff1a;结构体大小的计算并简单了解一下位段的相关知识。…

Niagara学习笔记

橙色 发射器 , 绿色 粒子, 红色 渲染器 Emitter State 发射器状态 Life Cycle Mode&#xff08;生命周期模式&#xff09; 选择Self就是发射器自身管理生命周期 Loop Behavior 决定粒子发射次数 一次&#xff08;Once&#xff09;&#xff1a;发射器只播放一次多次&#…

14-6-3C++STL的list

&#xff08;一&#xff09;list的插入 1.list.insert(pos,elem);//在pos位置插入一个elem元素的拷贝&#xff0c;返回新数据的位置 #include <iostream> #include <list> using namespace std; int main() { list<int> lst; lst.push_back(10); l…

可爱狗狗的404动画页面HTML源码

源码介绍 可爱狗狗的404动画页面HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果 效果预览 源码获取 可爱狗狗的404动画页面HTML源码

C++17 std::variant 详解:概念、用法和实现细节

文章目录 简介基本概念定义和使用std::variant与传统联合体union的区别 多类型值存储示例初始化修改判断variant中对应类型是否有值获取std::variant中的值获取当前使用的type在variant声明中的索引 访问std::variant中的值使用std::get使用std::get_if 错误处理和访问未初始化…

单路由及双路由端口映射指南

远程登录总会遇到登陆不上的情况&#xff0c;可能是访问的大门没有打开哦&#xff0c;下面我们来看看具体是怎么回事&#xff1f; 当软件远程访问时&#xff0c;主机需要两个条件&#xff0c;一是有一个唯一的公网IP地址&#xff08;运营商提供&#xff09;&#xff0c;二是开…

【Elasticsearch】RestClient操作文档

RestClient操作文档 新增文档实体类API语法 查询文档DSL查询 删除文档修改文档批量导入文档小结 新增文档 将数据库中的信息导入elasticsearch中 以商品数据为例 实体类 定义一个索引库结构对应的实体。 Data ApiModel(description "索引库实体") public class …

【项目】基于Qt开发的音乐播放软件

目录 项目介绍 项目概述 界面开发 界面分析 创建工程 主界面布局设计 窗口主框架设计 界面美化 主窗口设定 添加图片资源 head处理 播放控制区处理 自定义控件 BtForm 推荐页面 自定义CommonPage 自定义ListItemBox 自定义MusicSlider 自定义VolumeTool 音…

2025-01-28 - 通用人工智能技术 - RAG - 本地安装 DeepSeek-R1对话系统 - 流雨声

摘要 2025年1月28号 周二&#xff08;除夕&#xff09; 杭州 惠风和畅 小记: 昨天在图书馆整理访谈案例&#xff0c;除了吃饭基本没有停下来直到晚上9点才勉强搞完。每份访谈在3-5万字&#xff0c;总结梳理后每个访谈的字数也在 5000 字左右&#xff0c;接下来如何组织又是一…

电路研究9.2.3——合宙Air780EP中FTP——FTPGET 命令使用方法研究

怎么说呢&#xff0c;之前也是看的&#xff0c;但是也很迷茫&#xff0c;感觉上虽然是对的&#xff0c;但是无法联系到应用里面&#xff0c;今天研究一下FTP 命令使用方法吧。 15.29 使用方法举例 这里发现下面那些看的不懂呢&#xff0c;于是就返回FTP的应用了。 9.5.4 FTP 应…