1. 进制简介
2. 进制转换
3. 原码、反码、补码
4. 位运算符
5. 移位运算符
6. 位运算符的作用
一、进制简介
进制,是指进位规则,表示逢X进一。比如,十进制逢十进一,二进制逢二进一,八进制逢八进一。
常见的进制:二进制、八进制、十进制、十六进制。
- 二进制:使用【0】【1】表示每一位上的数。
- 八进制:使用【0】【1】【2】【3】【4】【5】【6】【7】表示每一位上的数。
- 十六进制:使用【0】【1】【2】【3】【4】【5】【6】【7】【8】【9】【A】【B】【C】【D】【E】【F】表示每一位上的数。
在 Java 中,数字默认是十进制,表示其他进制需要加前缀。
- 二进制:以 0b 开头,b 大小写都可以。
- 八进制:以 0 开头。
- 十六进制:以 0x 开头,x 大小写都可以。
二、进制转换
2.1 其他进制转十进制
公式:系数 * 基数的权次幂,结果相加。
- 系数:每一位的数字;
- 基数:几进制就是几;
- 权:从右向左,以0开始,逐个 +1。
比如,二进制 100 转为十进制:
结果 = 0 * 2 ^ 0 + 0 * 2 ^ 1 + 1 * 2 ^ 2 = 4
2.2 十进制转其他进制
公式:除基数倒序取余,直到商为 0。
比如,十进制 6 转为二进制:
结果 = 110
2.3 二进制转八进制
从右开始,3个二进制位,是八进制的1位。
比如,二进制 01011001 转为八进制:
结果 = 131
2.4 二进制转十六进制
从右开始,4个二进制位,是十六进制的1位。
比如,二进制 01011001 转为十六进制:
结果 = 59
三、原码、反码、补码
对于有符号的数而言:
- 二进制的最高位是符号位:0表示正数,1表示负数;
- 正数和0的原码、反码、补码都一样;
- 负数的反码 = 原码符号位不变,其他位取反;
- 负数的补码 = 反码 + 1;
- 计算机是以补码的方式运算。
原码与补码快速转换方式:
- 符号位不变,从低位向高位,第一个1和之后的不变,其余位取反。
四、位运算符
Java中的位运算符有4个:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)。
异或,相当于不进位加法。
- 任何数异或本身结果为 0;
- 异或符合交换律:a ^ b = b ^ a;
- 异或符合结合律:a ^ b ^ c = a ^(b ^ c)= (a ^ b)^ c;
- 异或 0 具有保持的特点,异或 1 具有反转的特点;
- c = a ^ b => a = b ^ c;
五、移位运算符
Java中的移位运算符有3个:
左移 <<
:高位溢出,低位补 0。左移 n 相当于乘 2 的 n 次方。
右移 >>
:符号位不变,低位溢出,高位补符号位数字。右移 n 相当于除 2 的 n 次方。
无符号右移 >>>
:符号位当数字,低位溢出,高位补 0。
【 注意】
- 左移符号位也会变!
- 一个数左移(右移)32的倍数等于本身;
- 一个数左移(右移)n 位,n > 0,实际移动的位数为 n % 32;n < 0,实际移动的位数为(32 + n % 32);
【有趣】-1 >>> 1,结果为最大整数。
六、位运算符的作用
1. 求奇偶数:
n & 1 == 1? 奇数:偶数
2. m * 2^n = m << n;m / (2^n) = m >> n;
3. 不用临时变量交换2个值:
a = a ^ b;
b = a ^ b;
a = a ^ b;
4. x % 2^n = x & (2^n - 1);
5. 将1个数转成 >= 它本身的第一个 2 的 n 次方的方法:
n -= 1
n |= n >>> 1
n |= n >>> 2
n |= n >>> 4
n |= n >>> 8
n |= n >>> 16
n += 1