位操作(Bit Manipulation)会让人觉得很神奇。实际上,它巧妙地利用了计算机使用二进制表示数据这一特点,将一些位操作产生的效果转化,解决相应的问题。
异或操作
这是一种比较常见的操作,我们需要随时考虑到它。
- 和0异或得到的值还是它本身。
- 和自己异或得到0。
1. 利用位操作进行英文字符大小写转换
('a' | ' ') = 'a'
('A' | ' ') = 'a'
('b' & '_') = 'B'
('B' & '_') = 'B'
('d' ^ ' ') = 'D'
('D' ^ ' ') = 'd'
2. 判断两个数是否异号
int x = -1, y = 2;
bool f = ((x ^ y) < 0); // true符号不同
int x = 3, y = 2;
bool f = ((x ^ y) < 0); // false符号相同
这个技巧比较实用,原理是利用补码表示的符号位判断。
如果读者想利用乘法或除法来判断两个数是否异号,可能会造成溢出。
- 不用临时变量交换两个数
int a = 1, b = 2;
a ^= b;
b ^= a;
a ^= b;
// 现在 a = 2, b = 1
n&(n-1)
这个操作是算法中常见的,作用是消除数字 n 的二进制表示中的最靠近右边的那个1。
leetcode中题目191,231都利用了这个。