位操作(Bit Manipulation
)是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。
位操作包括:
¬¬
取反(NOT
)~
∩∩
按位或(OR
) |
⊕⊕
按位异或(XOR
) ^
∪∪
按位与(AND
) &
移位
移位
是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。
移位又分为
算术移位
: 空缺部分添加的数和符号有关
逻辑移位
: 统一添0
136. 只出现一次的数字
代码:
class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for (int num : nums) {
res ^= num;
}
return res;
}
}
解释
17 ^ 19 ^ 17 = 17 ^ 17 ^ 19 = 19
一个十进制数的二进制形式中1的个数
与运算
利用与运算0&1=0,不断将一个非零数不断将二进制形式中的1置于0
public int getOneNum(int n) {
int res = 0;
while (n > 0) {
n = n & (n - 1);
res++;
}
return res;
}
判断一个数是否为2的幂,
比如1=2 ^ 0, 2=2 ^ 1,4=2^2
与运算
利用与运算中,2&1=0
,4&3=0
,利用2
的幂 - 1与2
的幂的与运算结果为0
,2
的幂的二进制形式一定只有一位为1
,其他为0
,而他的减一形式一定是这一位为0
,其他为1
.
public boolean isTwores(int n) {
return (n & (n - 1)) == 0;
}
将一个double类型的小数转换为二进制表示
public String Double2Binary(double d) {
StringBuilder res = new StringBuilder();
int z = (int) d;
res.append(Integer.toBinaryString(z));//整数部分
d = d - z;
//小数部分
while(d != 0){
int t = (int) (d * 2);
res.append(t);
d = d* 2 - t;
}
return res.toString();
}
一个重要结论:
10个相同的10进制数做不进位的加法,一定是0 ,
2个相同的2进制数做不进位的加法,一定是0,
k个相同的k进制数做不进位的加法,一定是0