简单介绍一下java位运算
简单位运算介绍
或 | 只要有一个为1,结果就为1。
与 & 两位全为1,结果才为1
与的特殊用法:取一个数中特定位。
方法:找一个数,对应x要取的位,该数的对应位为1,其余位为零,此数与X对应位与即可(一个数和一个数的相反数做与操作得到的是这个数从右往左第一个不为0的数。)
例如:设X=1010 1110,取X的低四位,用X&0000 1111=0000 1110即可得到。
非 ~ 对一个二进制数按位取反,即将0变为1,1变0
异或 ^ 两个相应位为“异”(值不同),则该位结果为1,否则为0
异或特殊用法
(1) 与1相异或,使特定位翻转
方法:找一个数,对应X要翻转的位,该数的对应为1,其余位为零,此数与X对应位异或即可。
例如:X=1010 1110,使X低四位翻转,用X^0000 1111=1010 0001即可得到。
(2) 与0相异或,保留原值
位运算应用-变量交换
普通的变量交换方法需要借助第三个变量
如果采用异或则不需要借助第三个变量就可以使交换 code:
System.out.println("--------2.面试问到的异或计算法---------"); System.out.println("原理:a^b^a = a "); int a2 = 1; int b2 = 2; a2 = a2^b2; b2 = a2^b2;//b2 = a2^b2^b2 = a2 a2 = a2^b2;//a2 = a2^b2^b2 = b2 System.out.println("交换后: a2 = "+a2); System.out.println("交换后: b2 = "+b2);
原理
1. ^是异或运算符,异或的规则是转换成二进制比较,相同为0,不同为1.
2. a^b^a = b
位运算应用
LeetCode
参考LeetCode只出现一次的数字:
136题 https://leetcode-cn.com/problems/single-number-iii/
260题 https://leetcode-cn.com/problems/single-number-iii/
260题分组思想:只要异或的结果在某一位是1,这就意味着在这位异或成它的两个数 一个为0 一个为1
同时第260题需要了解补码:
二进制源码取反叫反码,反码加1叫补码,补码就是负数在计算机中的二进制表示方法。
a&(-a)可以得到最右边的那个1,// 6&(-6)=2 5&(-5)=1
计算机精度的问题
double和float为什么会精度丢失
BigDecimal怎么解决的