1,Java位运算
1)二进制数制(
java不提供代码直接写二进制数,可以使用0x十六进制表示无符号的正整数
)
计算机数据最终以二进制形式存在。
二进制数使用补码表示,最高位为符号位,正数符号位0,负数符号位1。
正数补码:二进制表示本身。如7 -> 0...0111
负数补码:绝对值补码,取反然后+1。如 -7 -> (0...0111 -> 1...1000 -> 1...1001)
2)逻辑运算符
~按位取反。~ 0...0111 -> 1...1000。~n = -n - 1
&按位与(同1为1,不同为0。) 0...0111 & 0...0101 -> 0...0101
|按位或(存在1则为1,否则为0。) 0...0101 | 0...010 -> 0...0111
^按位异或(相同为0,不同为1。) 0...0101 ^ 0...0010 -> 0...0111
3)移位运算符
<<有符号左移,相当于 *2,如计算n*(2^m) = n << m
>>有符号右移,相当于 /2
>>>无符号右移,最高位补0
2,位运算的应用
1)异或^ 交换变量、反转指定位
交换变量:原理变量a异或b两次(针对所有的1异或2次)等于本身。 a ^ b ^ b = a
反转指定位:0异或任何数=本身; 1异或任何数=取反;任何数异或自己=把自己置0。
a = a ^ b
b = b ^ a
a = a ^ b
2)位与& 判断奇偶
(a & 1) == 1 表示最后一位为1,代表奇数
(a & 1) == 0 表示最后一位为0,代表偶数
3)位与& 清零、取某几位
使用>>移位操作、& 0xff来完成
4)位溢出与截断
两个int数相加可能导致溢出。如Integer.MAX_VALUE + Integer.MAX_VALUE。
求两个数的mid,使用 min + (max - min) / 2,不适用 (max+min)/2。
int型强制转换成byte -> 只取低8位。
5)位运算优化
取余:a % 2
=>a & 1
;a % (2^n)
=>a & (2^n) - 1
乘除:<<左移、>>右移
相反数:-n = ~n + 1
3,进制转换
1)除k取余法,进制转换。
十进制转16进制
decimal % 16 可以优化为 decimal & 15
decimal / 16 可以优化为 decimal >>> 4
image.png
2)Integer.toBinaryString分析只能处理无符号整数
image.png
image.png