听说位运算挺好玩的,那这节总结一下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. VS编译时,出现无法将文件“obj\Debug\*.exe”复制到“bin\Debug\*.exe”。文件“bin\Debug\*.exe”正由另一进程使用,因此该进程无法访问此文件。

    重命名将MyThread.exe 重命名 一下其他名字后就可以了.

  2. PyTorch 中 torch.matmul() 函数的文档详解

    官方文档 torch.matmul() 函数几乎可以用于所有矩阵/向量相乘的情况,其乘法规则视参与乘法的两个张量的维度而定. 关于 PyTorch 中的其他乘法函数可以看这篇博文,有助于下面各种乘法的 ...

  3. Linux修改权限命令chmod用法示例

    Linux公社 2020年10月13日 来自:Linux迷 网址:https://www.linuxmi.com/linux-chmod.html Linux中的Chmod命令用于更改或分配文件和目录 ...

  4. Centos Linux下载rpm软件包(基础环境篇)-从零到无

    --时间:2020年10月23日 --作者:飞翔的小胖猪 一.概述 1.1  前言 很多生产环境往往是独立的一张网络不与互联网相通,经常会出现的问题就是应用在部署的时候无法安装配套的依赖包.导致很简单 ...

  5. C语言刷2数/3数/4数之和

    15. 三数之和 /** * Return an array of arrays of size *returnSize. * The sizes of the arrays are returned ...

  6. 06-CircuitBreaker断路器

    1.介绍 Spring Cloud Circuit breaker provides an abstraction across different circuit breaker implement ...

  7. thinkphp6的一些用法

    Thinkphp6笔记一:安装http://www.thinkphp.cn/topic/68371.htmlThinkphp6笔记二:开启多应用模式http://www.thinkphp.cn/top ...

  8. const 对象的属性能否修改

    const保证的并不是变量的值不能改动,而是变量指向的那个内存地址不能改动. 对于基本类型的数据(数值.字符串.布尔值),其值就保存在变量指向的那个内存地址,因此等同于常量. 对于引用类型的数据(主要 ...

  9. SignalR 入门 .netCore实现聊天室

    SignalR 入门 .netCore实现聊天室 本文根据微软SignalR 简介 | Microsoft Docs 和 ASP.NET Core SignalR 简介 | Microsoft Doc ...

  10. Linux 中如何使用 Htop 监控工具?【网络安全】

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 一.Htop 界面展示 "Htop 是一个用于 Linux/Unix 系统的交互式实时进程监控应用程序,也是 top 命令的替代品,它是所 ...