Java - 位运算

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 & 1a % (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

你可能感兴趣的:(Java - 位运算)