当前位置: 首页 > news >正文

算法小练之 位运算基础

前言

今天正式走入,位运算这个章节,关于这一部分我会先介绍几个重要的知识点,然后再根据几个力扣上的题来讲解。

了解6种位操作

总所周知,变量在计算机中都是二进制存储的,比如一个变量int a = 1;

它的存储方式就是:

>>(右移):

用法:a>>x

含义:将a的二进制位数整体右移x位

举例:

<<(左移):

用法:x<<a

含义:将a的二进制位数整体左移x位

举例:

 ~(按位取反):

用法:~a

含义:将a的所有二进制位进行取反,1改为0,0改为1

举例:

&(按位与):

用法:a&b

含义:有0为0,无0为1

举例:

二级结论:

x为任何数

x & 1 = x 

|(按位或): 

用法:a|b

含义:有1为1,无1为0

 举例:

二级结论:

x为任何数

x | 0 = x 

^(按位异或)  : 

用法:a^b

含义:相同为0,相异为1

举例:

二级结论:

x为任何数

x ^ 0 = x

x ^ x = 0

a ^ b ^ c = a ^ c ^ b = a ^ (b ^ c) 

现在可以学习一些基本的位操作了 

 1.确定数n二进制第x位是0还是1

注意:x为用右往左从0开始计数的下标

结论:

(n>>x) & 1

原理很简单,自己随便模拟一下即可。

2.将数n二进制的第x位改成1

结论:

n = n | (1 << x)

3.将数n二进制的第x位改成0

结论:

n = n & (~ (1 << x))

4.提取一个数n最右侧的1

结论: 

n & (-n)

5.干掉一个数n最右侧的1 

结论: 

n & (n - 1)

题目实战:

位1的个数:

题目很简单,就是给一个数n,求它的二进制中有多少个1。

思路:

 借助结论1:确定数n二进制第x位是0还是1,从右往左遍历所有二进制位,发现1就计数器++:

class Solution {
public:int hammingWeight(int n) {int ret = 0;for(int i = 0;i<32;i++)//从右往左遍历整个二进制{if(((n>>i)&1)==1)//检查第i位是否为 1{ret++;}}return ret;}
};

比特位计数:

本题和上一题相差不大,只需加一层for遍历0 -- n即可:

class Solution {
public:vector<int> countBits(int n) {vector<int> ret;for(int i = 0;i<=n;i++){int count = 0;for(int j = 0;j<32;j++){if(((i>>j)&1) == 1){count++;}}ret.push_back(count);}return ret;}
};

汉明距离:

思路: 

做了上面两道题后,再看这道题就会发现很简单,我们只需先将x^y,因为^操作相同为0,相异为1,我们只需统计x^y后二进制位中有多少个1即可:

class Solution {
public:int hammingDistance(int x, int y) {int ret = 0;int n = x ^ y;for(int i = 0; i<32 ;i++){if(((n>>i)&1) == 1){ret++;}}return ret;}
};

 这几道题较为基础,是深入学习的前提,希望大家好好掌握。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 百数教学——表单提交校验,为数据准确保驾护航
  • 试用笔记之-汇通Exe可执行文件之pe分析
  • Jenkins构建python项目
  • hf-mirror (huggingface 的国内镜像)
  • 【深度学习基础】环境搭建 Linux报错bash: conda: command not found...
  • [C++]: 模板进阶
  • 【Nvidia+AI相机】涂布视觉检测方案专注提高锂电池质量把控标准
  • 数据分析入门指南:表结构数据(三)
  • MySQL8之mysql-community-devel的作用
  • 基于PHP+MySQL组合开发的家政预约小程序源码系统 带完整的安装代码包以及搭建部署教程
  • android调用openssl库
  • PHP同城多商户多行业系统小程序源码
  • UML建模案例分析-时序图和类图的对应关系
  • MySQL 中 SQL 查询语句的执行顺序
  • 基于go-zero二次开发的脚本
  • JavaScript 如何正确处理 Unicode 编码问题!
  • “大数据应用场景”之隔壁老王(连载四)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2017年终总结、随想
  • 2019年如何成为全栈工程师?
  • android 一些 utils
  • Angularjs之国际化
  • Git同步原始仓库到Fork仓库中
  • Meteor的表单提交:Form
  • mysql_config not found
  • Python十分钟制作属于你自己的个性logo
  • QQ浏览器x5内核的兼容性问题
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • sessionStorage和localStorage
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 老板让我十分钟上手nx-admin
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​TypeScript都不会用,也敢说会前端?
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​人工智能书单(数学基础篇)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #NOIP 2014# day.2 T2 寻找道路
  • (007)XHTML文档之标题——h1~h6
  • (07)Hive——窗口函数详解
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十八)Flink CEP 详解
  • (图)IntelliTrace Tools 跟踪云端程序
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)LINQ之路
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .NET WPF 抖动动画
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .php文件都打不开,打不开php文件怎么办
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @RestController注解的使用
  • [ 第一章] JavaScript 简史
  • [2016.7 test.5] T1