听说位运算挺好玩的,那这节总结一下ACM中可能用到的位运算技巧。

XOR运算极为重要!!(过[LC136](只出现一次的数字 - 力扣(LeetCode)):数组中每个数字都出现两次,只有一个出现一次,找到出现一次的数字)

1. 如果我们对 0 和二进制位做 XOR 运算,得到的仍然是这个二进制位
a⊕0=a
2. 如果我们对相同的二进制位做 XOR 运算,返回的结果是 0
a⊕a=0
3. XOR 满足交换律和结合律
a⊕b⊕a=(a⊕a)⊕b=0⊕b=b

<<一次相当于*2,>>一次相当于/2

使用:

  1. 判断奇偶数(数&1,为1奇数;为0偶数)
  2. 获取二进制为是1还是0(&运算)
  3. 交换两个整数变量的位置(不常用,有编译优化)
  4. 使用异或运算消除重复。
  5. 使用N&(N-1)消掉N的二进制形式的低位0。

问题一:判断二进制中1的个数([LC461](汉明距离 - 力扣(LeetCode)), [LC476](数字的补数 - 力扣(LeetCode)):

1.每次二进制位向右移动一位,并&1判断是否结果为1。

2.使用N&(N-1)一次一次消掉低位0,count记录操作次数。count即为二进制中1的个数。

问题二:判断一个整数是不是2的整数次方。

问题转化为该整数的二进制形式是否只有一个1,其余全为0。

1 if (((N - 1) & N) == 0)  // 一条语句判断

问题三:将整数的二进制形式的奇偶位互换。

1.对i和(i+1)互换,循环中每次步进2位。

2.使用&运算取出二进制的奇数位和偶数位,移动后做XOR。

1 int main()
2 {
3 int i;
4 cin >> i; // 读取数
5 int ou = i & 0xaaaaaaaa;//与1010 1010 1010 ...做&运算取出偶数位
6 int ji = i & 0x55555555;//与0101 0101 0101 ...做&运算取出奇数位
7 cout << ((ou >> 1) ^ (ji << 1)) << endl;
8 }

ACM中的位运算技巧的更多相关文章

  1. 关于C/C++中的位运算技巧

    本篇文章讲述在学习CSAPP位运算LAB时的一些心得. 移位运算的小技巧 C/C++对于移位运算具有不同的策略,对于无符号数,左右移位为逻辑移位,也就是直接移位:对于有符号数,采用算术移位的方式,即左 ...

  2. ACM位运算技巧

    ACM位运算技巧 位运算应用口位运算应用口诀位运算应用口诀 清零取反要用与,某位置一可用或 若要取反和交换,轻轻松松用异或 移位运算 要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形. ...

  3. PHP中的位运算与位移运算(其它语言通用)

    /* PHP中的位运算与位移运算 ======================= 二进制Binary:0,1 逢二进1,易于电子信号的传输 原码.反码.补码 二进制最高位是符号位:0为正数,1为负数( ...

  4. C语言中的位运算和逻辑运算

    这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...

  5. Google Earth Engine 中的位运算

    Google Earth Engine中的位运算 按位运算是编程中一个难点,同时也是在我们后续处理影像数据,尤其要使用影像自带的波段比如QA波段经常会用到的一个东西.通过按位运算我们可以筛选出我们想要 ...

  6. C语言中的位运算的技巧

    一.位运算实例 1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成01 ...

  7. C++中的位运算总结

    1)位运算 位运算是指对转换成二进制的数字进行每一位上的0.1的运算,运算涉及到五种运算:与(&),或(|),异或(^),左移(<<),右移(>>). 如下表所示:   ...

  8. 你必须知道的基本位运算技巧(状压DP、搜索优化都会用到)

    一. 位操作基础 基本的位操作符有与.或.异或.取反.左移.右移这6种,它们的运算规则如下所示: 符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两个位都为0时,结果才为0 ...

  9. js中的位运算

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...

随机推荐

  1. CultureInfo、DateTimeFormatInfo、NumberFormatinfo之间的关系

    CultureInfo.DateTimeFormatInfo.NumberFormatinfo之间的关系 线程中CurrentCulture和CurrentUICulture 区别 以下是win10操 ...

  2. 带你掌握Redis数据类型:string和Hash

    摘要:Redis中有五大数据类型,分别是String.List.Set.Hash和Zset. 本文分享自华为云社区<Redis的string类型常用命令解析>,作者:灰小猿 . 先问大家一 ...

  3. Python:numpy

    学习自:NumPy 教程 | 菜鸟教程 官网:Numpy官方文档 1.简介 numpy主要用于数组计算,包含: 1)一个强大的N维数组对象ndarray 2)广播功能函数 3)整合 C/C++/For ...

  4. 关于Web的一些知识,Web怎么构成?

    前端学习:学习地址:黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动,下面这些都是一些学习笔记.临渊羡鱼,不如退而结网!!愿我自己学有所成,也愿每个前端爱好者学有所成 ...

  5. tp5 Redis缓冲的设置与清除

    控制器代码: //设置缓冲的方法 public function order() { $word = input('word');//接受搜索值 //题意:将订单数据使用redis进行缓存中,第二次读 ...

  6. Vue3+ElementPlus的一套开源前台+后台管理模板

    Vue-Element-Faster 基于最新版vue.js 3.x与element-plus2.x实现的一套前台展示系统.后台管理系统模板,自带权限管理模块. API接口基于SpringBoot2. ...

  7. 无法更新apt镜像源?树莓派安装最新版Debian11(bullseye)arm64位系统步骤

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 树莓派系统在2022年1月28日迎来了更新,更新了64位的系统,同时也有lite系统供我们使用.32位系统很多软件都用不了,特别是宝塔面板.下面是安 ...

  8. Termux镜像在阿里云镜像站首发上线

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 简介 Termux 是 Android 平台上的一个终端模拟器,它将众多 Linux 上运行的软件和工具近乎完美的移植到了手机端. 无需任何复杂的安 ...

  9. Vmware安装Ubuntu16.4的过程及出现问题的解决

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 1.下载Ubuntu镜像文件 Ubuntu16.4镜像文件下载地址:https://mirrors.aliyun.com/ubuntu-relea ...

  10. bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)

    bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...