从labuladong东哥那里看到的位运算小技巧

  • 1. 利用或操作 `|` 和`空格`将英文字符转换为小写
  • 2. 利用与操作 `&` 和`下划线`将英文字符转换为大写
  • 3. 利用异或操作 `^` 和`空格`进行英文字符大小写互换
  • 4. 判断两个数是否异号
  • 5. 不用临时变量交换两个数
  • 6. n&(n-1)用来消除数字 n 的二进制表示中的最后一个 1
  • 7. 判断一个数是不是 2 的指数
  • 8. 查找只出现一次的元素
  • 9. n>>1表示n/2,n<<1表示n*2就不细说了

说实话,最近做题这些位运算小技巧帮了不少忙,不能藏着掖着也给大家分享一下

1. 利用或操作 |空格将英文字符转换为小写

('a' | ' ') = 'a'
('A' | ' ') = 'a'

原因:
查ASCII表可知
空格' '的十进制是32,二进制也就是00100000
  'A'的十进制是65,二进制也就是01000000
  'a'的十进制是97,二进制也就是01100000
不难看出,让大写和小写字母按位或上' '就能取到小写的字母,是个不错的结论

2. 利用与操作 &下划线将英文字符转换为大写

('b' & '_') = 'B'
('B' & '_') = 'B'

原因也同上

3. 利用异或操作 ^空格进行英文字符大小写互换

('d' ^ ' ') = 'D'
('D' ^ ' ') = 'd'

4. 判断两个数是否异号

我们一般可能想利用乘积或者商来判断两个数是否异号,但是这种处理方式可能造成溢出,从而出现错误。
下面这种方法就不用考虑是否会溢出的问题:

int x = -1, y = 2;
bool f = ((x ^ y) < 0); // trueint x = 3, y = 2;
bool f = ((x ^ y) < 0); // false

5. 不用临时变量交换两个数

int a = 1, b = 2;
a ^= b;
b ^= a;
a ^= b;
// 现在 a = 2, b = 1

6. n&(n-1)用来消除数字 n 的二进制表示中的最后一个 1

其核心逻辑就是,n - 1 一定可以消除最后一个 1,同时把其后的 0 都变成 1,这样再和 n 做一次 & 运算,就可以仅仅把最后一个 1 变成 0 了。
例如剑指offer第15题:

class Solution {public:int hammingWeight(uint32_t n) {int res = 0;while(n){n = n&(n-1);res++;}return res;}
};

很轻松吧。

7. 判断一个数是不是 2 的指数

一个数如果是 2 的指数,那么它的二进制表示一定只含有一个 1:

2^0 = 1 = 0b0001   #此处^为次方的意思
2^1 = 2 = 0b0010
2^2 = 4 = 0b0100

如果使用位运算技巧就很简单了(注意运算符优先级,括号不可以省略):

bool isPowerOfTwo(int n) {if (n <= 0) return false;return (n & (n - 1)) == 0;
}

8. 查找只出现一次的元素

leetcode上136题:

这里就可以运用异或运算的性质:

一个数和它本身做异或运算结果为 0,即 a ^ a = 0;一个数和 0 做异或运算的结果为它本身,即 a ^ 0 = a

对于这道题目,我们只要把所有数字进行异或,成对儿的数字就会变成 0,落单的数字和 0 做异或还是它本身,所以最后异或的结果就是只出现一次的元素:

int singleNumber(vector<int>& nums) {int res = 0;for (int n : nums) {res ^= n;}return res;
}

9. n>>1表示n/2,n<<1表示n*2就不细说了

从labuladong东哥那里看到的位运算小技巧相关推荐

  1. 2020 China Collegiate Programming Contest Changchun F - Strange Memory(dsu on tree + 位运算小技巧)

    题目连接: https://codeforces.com/gym/102832/problem/F 首先写这个题的时候要注意内存的问题 不要瞎几把define int long long 题解: 考虑 ...

  2. 位操作符的一些运算小技巧

    位操作符的一些运算小技巧 本文主要介绍一些会经常使用到的位操作小技巧. 首先呢,给大家分享一个C语言练习的网站:C语言练习 使用位操作符时有以下两点需要注意 进行位运算时数据全部是换算为二进制的. 位 ...

  3. C51位运算应用技巧

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

  4. c语言或者cpp中位运算的技巧

    简述 在知乎上看到一个题目,解答很有意思,用的是位运算. 这让我觉得位运算有更多的算法可能,但是却还没被我用过. 这种东西都是第一次看,觉得挺牛的,第二次,第三次看的时候就觉得没什么了.So,大佬们轻 ...

  5. 位运算常用技巧分析汇总(算法进阶)

    文章目录 运算性质 异或运算的一些性质 秀秀伸手 1.只用位运算来完成两个整数相加 2.不用临时变量,交换a.b两个数的值 3.判断一个数是奇数还是偶数 3.快速计算2*n.2*n+1和n/2 4.` ...

  6. java求绝对值absultevalue,位运算常见技巧

    在新浪微博上看到一篇文章写位运算的写的很深入,文章链接见末尾,特此mark. 0.位运算的种类 符号 名称 运算规则 & 与 两个位都为1时,结果才为1,否则都为0 l 或 两个位都是0时,结 ...

  7. 位运算常用技巧以及练习

    几个有趣的操作 利用或操作|和空格将英文字符转换成小写 // 可以变成小写i := 'a' | ' 'fmt.Printf("%c\n", i)j := 'A' | ' 'fmt. ...

  8. 【面试锦囊】位运算介绍与经典例题总结

    原创公众号:bigsai 原创不易,如果有收获请不要吝啬你的赞赞! 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 位运算隐藏在编程语言的角落中,其神秘而又强大,暗藏内力,有些 ...

  9. 你可能不知道的位运算技巧

    作者 | bigsai  责编 | 张文 头图 | CSDN 下载自视觉中国 位运算隐藏在编程语言的角落中,其神秘而又强大,暗藏内力,有些人光听位运算的大名的心中忐忑,还有些人更是一看到位运算就远远离 ...

最新文章

  1. Task04:青少年软件编程(Scratch)等级考试模拟卷(二级)
  2. c# 获取ajax数据,c# asp.net jQuery AJAX 从 MySQL 中获取数据
  3. 使用SmsManager服务群发短信
  4. ZT 为什么Java中继承多数是有害的?
  5. 一个ABAP调试器里查看类的静态属性的小技巧
  6. 腾讯位置服务:有何优势?如何使用平台创建应用和服务调用的 Key?
  7. 随想录(构建自己的代码库)
  8. 升级Exchange server 2010 SP1至SP3版本相关问题解决方法
  9. C#绘制条码CODE39和CODE39全码模式
  10. Qt创建Qt Designer自定义控件及使用
  11. JAVA后台随机生成一个中文名字
  12. PV、UV、VV的意义及区别
  13. 【企业安全实战】开源HIDS OSSEC部署与扩展使用
  14. JRUL数字交流三相电流继电器
  15. 3d模型多怎么优化_高德地图又出逆天黑科技!全国各大城市模型直接获取
  16. 区块链学习2-合约开发
  17. Python数据结构与算法(3)--基本数据结构
  18. 放大器构成电压跟随器 proteus仿真 TLV2252
  19. springboot电商系统-生鲜电商-蔬菜商城
  20. 2014Esri中国用户大会:ArcGIS平台六大亮点能力

热门文章

  1. 听说厕所要革命???智慧厕所|智慧公厕|智慧城市
  2. 原力计划【MySQL数据库】- 多表查询
  3. ARM主板和X86主板的优缺点比较
  4. 基于ssm+vue的医院门诊病历系统(源代码+数据库+11000字文档)626
  5. 《反脆弱》读书笔记(1)
  6. 下沉电商两道光:拼多多抓下沉用户,聚划算做品牌下沉
  7. java实现消息提醒功能,2021最新版!
  8. 圣诞节,教你用Python给微信头像添加一个圣诞帽!
  9. iOS 开发之照片框架详解
  10. c,c++小白到大神系列教程之一:C语言入门-王健伟-专题视频课程