位运算技巧
好用的位操作
class Solutions {void fun() {// 利用或操作 空格和英文字符转化小写('a' | ' ') = 'a';('A' | ' ') = 'a';// 利用与操作 _下划线和英文字符转化大写('a' & '_') = 'A';('A' & '_') = 'A';// 利用异或操作 空格和英文字符大小写互换('a' ^ ' ') = 'A';('A' ^ ' ') = 'a';// 判断两个数是否异号int x = -1, y = 2;boolean f = ((x ^ y) < 0); // truex = 1;y = 2;boolean f = ((x ^ y) < 0); // false// 不需要临时变量可交换两数int a = 1, b = 2;a ^= b;b ^= a;a ^= b;// 加1int n = 1;n = -~n;// 减1int m = 2;m = ~-m;}void bitOperate() {int n = 234;// 消除数字n最后一个1,n转换成二进制后最后一个数字1n & n - 1;}}
【应用示例】
class Example {/*** 136* https://leetcode-cn.com/problems/single-number/* 计算数组里只出现一次的数组* 一个数字异或它本身 = 0* 一个数字异或0 = 它本身** @param nums* @return*/public int singleNumber(int[] nums) {int vis = 0;for (int i = 0; i < nums.length; i++) {vis ^= nums[i];}return vis;}/*** 231* https://leetcode-cn.com/problems/power-of-two/* 判断数字n是否是2的幂次方* n & n - 1* 数字与数字-1,消除最后一个1* 如果是幂次方,则只有一个1* @param n* @return*/public boolean isPowerOfTwo(int n) {if (n <= 0) {return false;}return (n & n - 1) == 0;}/*** 191* https://leetcode-cn.com/problems/number-of-1-bits/submissions/* 计算汉明权重,算出有多少位=1* n & n - 1* 数字与数字-1,消除最后一个1* 一直到数字没有1即 = 0* @param n* @return*/public int hammingWeight(int n) {int res = 0;while (n != 0) {n &= n - 1;res++;}return res;}}
