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

位运算(更新中)

一、基础知识

1.基础位运算

        <<  左移操作符                     &按位与     有0就是0   

        >>右移操作符                       |  按位或       有1就是1             

        ~按位取反                           ^异或            相同为1,相异为0 / 无进位相加

                                                    例如     1 0 1 1 0 1   ^

                                                                 1 1 0 1 1 0    

                                                     结果为 0 1 1 0 1 1,无进位相加就是1 + 0 = 0,1+1 = 0,但是不会向高位进位

2.给一个数n,确定它的二进制表示中的第x位是0还是1

我们规定从右往左,的位数为第0,1,2,3,4,5.....31位

这样右移动的距离等于它的位数

(n >> x) & 1   ->  0 ------ 0

                           1 ------ 1

3.将一个数n的二进制表示的第x位修改成1

                                                                n = n | (1 << x)

4.将一个数n的二进制表示的第n位修改成0

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

5.位图的思想

                                                  每个比特位0或者1的数值表示一种状态

6.提取一个数n,二进制表示中最右侧的1

                                                lowbit = n & -n(取反加一即变为负)

7.将一个数n二进制表示中最右侧的1抹去

                                        n = n & (n - 1)

8.位运算的优先级

        能加括号就加括号

9.异或 ^,运算的运算律

1.a ^ a = 0

2.a ^ 0 = a

3.a ^ b ^ c = a ^ (b ^ c)

二、基础题目示例

1.位1的个数

. - 力扣(LeetCode)

class Solution {
public:int hammingWeight(int i) {int ret = 0;int n = 32;while(n > 0){if((i & 1) == 1)ret++;i  = i >> 1;n--;}return ret;}
};

        将要判断的数每次按位与1,若为1则此位为1,然后再右移一位

2.比特位计数

. - 力扣(LeetCode)

class Solution {
public:int Add(int i){int ret = 0;int n = 32;while(n > 0){if((i & 1) == 1)ret++;i  = i >> 1;n--;}return ret;}vector<int> countBits(int n) {vector<int>ret(n+1,0);for(int i = 0; i <= n;i++){ret[i] = Add(i);}return ret;}
};

        原理同上,只是多了一个循环

3.汉明距离

. - 力扣(LeetCode)

class Solution {
public:int hammingDistance(int x, int y) {int n = 32;int ret = 0;while(n>0){if((x & 1) != (y & 1))ret++;x = x >> 1;y = y >> 1;n--;}return ret;}
};

        分别用 &1 来判断两个数最低位是0还是1,对两个数进行比较,然后分别不断右移这两个数

4.只出现一次的数字

. - 力扣(LeetCode)

        利用异或的性质即可

class Solution {
public:int singleNumber(vector<int>& nums) {int val = 0;for(auto ch:nums){val ^= ch;}return val;}};

5.只出现一次的数字3

. - 力扣(LeetCode)

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {long long n = 0;for(auto ch: nums){n ^= ch;}long long mask = n &(-n);mask = (int)mask;vector<int>ret(2,0);for(auto ch: nums){if((ch & mask) == mask)ret[0] ^= ch;else ret[1] ^= ch;}return ret;}
};

        我们先将所有值异或,这个过程会将相同的数都消去,最后得到两个不同的数a,b异或的结果。

        这个数为1的位置,是两个数上值不同的位置。为了方便,我们取出最右侧的1。

        a,b两个数中,一个数的该位置为1,一个数为0.

        而待分开的数的该位置也一定为1或0.因此我们将全部数分为两组

        a,xx  yy zz                                b,mm,nn,oo

        这样即可分别取出单独的数

相关文章:

  • 本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备
  • PE安装win11原版系统“无法创建新的分区,也找不到现有的分区”和“windows无法对计算机进行启动到下一个安装阶段”的解决办法
  • 【参会邀请】第四届区块链技术与信息安全国际会议(ICBCTIS 2024)诚邀相聚江城!
  • 代码随想录第五十七天
  • Vue 常用组件间通信方式
  • 代码随想录算法训练营第 32 天 | LeetCode509斐波那契数列 LeetCode70爬楼梯 LeetCode749使用最小花费爬楼梯
  • 华为路由常见 LSA 类型的产生及作用域和字段详细解读
  • 杰理-1拖8 错误状态
  • 程序员找工作之操作系统面试题总结分析
  • 【Unity实战】给Unity的类添加新功能
  • Android笔试面试题AI答之线程Handler、Thread(3)
  • 基于 Kafka 的经验:AutoMQ 和 MinIO 如何解决成本和弹性挑战
  • 使用redis缓存文章浏览量
  • PHP中如何处理字符串
  • thinkphp8开发的广告联盟网站系统源码
  • 【面试系列】之二:关于js原型
  • 03Go 类型总结
  • Django 博客开发教程 8 - 博客文章详情页
  • HomeBrew常规使用教程
  • Invalidate和postInvalidate的区别
  • JAVA SE 6 GC调优笔记
  • laravel with 查询列表限制条数
  • PaddlePaddle-GitHub的正确打开姿势
  • PHP那些事儿
  • session共享问题解决方案
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vuex 学习笔记 01
  • Webpack 4 学习01(基础配置)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 跨域
  • 力扣(LeetCode)22
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 前言-如何学习区块链
  • 推荐一个React的管理后台框架
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • FaaS 的简单实践
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #QT(QCharts绘制曲线)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (70min)字节暑假实习二面(已挂)
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (js)循环条件满足时终止循环
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (离散数学)逻辑连接词
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (一)SpringBoot3---尚硅谷总结
  • (一一四)第九章编程练习
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)3D模板阴影原理
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)创业家杂志:UCWEB天使第一步
  • (转)使用VMware vSphere标准交换机设置网络连接