位运算应用场景(每遇更新)

1. and运算 &

and运算通常用于二进制取位操作

(1)例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。

// 由于自动补全动作,1的前面位全部为0,只有最后1位为1,故前面每一位与1运算结果都是0 // 而最后一位如果为0,即原数为偶数;如果为1,原数为奇数 if((a & 1) == 1) System.out.println("a为奇数"); if((a & 1) == 0) System.out.println("a为偶数");

2.or运算 |

or运算通常用于二进制特定位上的无条件赋值。

(1)例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。

int d = 6; int e = 11; System.out.println(d | 1);

3.xor运算 ^

(1)xor运算通常用于对二进制的特定一位进行取反操作,因为异或可以这样定义:0和1异或0都不变,异或1则取反。

char[] cs = Integer.toBinaryString(6).toCharArray(); for(char temp : cs){ System.out.println("原数: " + temp); System.out.println("翻转: " + (temp ^ 1)); // 小-->大,自动转换 }

力扣136:只出现一次的数字

(2)xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。

(3)a xor b = c 可以得到 a ^ c = b。

leetcode第,

(4)节省空间(不借用temp)的交换两个数的值

借助第三个变量来实现。C=A;A=B;B=C;

利用加减法实现两个变量的交换。A=A+B;B=A-B;A=A-B;

用位异或运算来实现,效率最高。A=A^B;B=A^B;A=A^B;(一个数异或本身等于0)

4.NOT运算,取反,~

5.左移运算:value<<num

1)数值value向左移动num位,左边二进制位丢弃,右边补0。(注意byte和short类型移位运算时会变成int型,结果要强制转换)

2)若1被移位到最左侧,则变成负数。

3)左移时舍弃位不包含1,则左移一次,相当于乘2。

6.右移运算:value>>num

1)数值value向右移动num位,正数左补0,负数左补1,右边舍弃。(即保留符号位)

2)右移一次,相当于除以2,并舍弃余数。

3)无符号右移>>>:左边位用0补充,右边丢弃。

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

其核心逻辑就是,n - 1 一定可以把最后一个 1变成0,同时把其后的 0 都变成 1,前面的不变。这样再和 n 做一次 & 运算,就可以仅仅把最后一个 1 变成 0 了。

那么如果要计算n中1的个数,就可以用判断n是否为0,逐次计算。

力扣191:位1的个数

经验分享 程序员 微信小程序 职场和发展