进制
- 二进制:以
0b或0B开头 - 八进制:以
0开头 - 十六进制:以
0x或0X开头,A-F不区分大小写
int n1 = 0b1010; // 二进制
int n2 = 037; // 八进制
int n3 = 0x3f; // 十六进制
原码、反码、补码
0 的反码、补码均为 0
Java 不存在 无符号数 ,换言之,所有数字都是 有符号 的
计算机运算时采用 补码 方式运算
我们看运算结果时,看的是 原码
位运算符
Java 中有 7 个位运算符:
& 按位与
| 按位或
^ 按位异或
~ 按位取反
>> 算术右移 低位溢出,符号位不变,并用符号位补溢出的高位
<< 算术左移 符号位不变,低位补 0
>>> 逻辑右移也叫无符号右移 低位溢出,高位补 0
特别说明:没有 «< 符号
以 ~ 按位取反为例,前 4 个同理
//先将数字全部转成 2 进制补码,再做运算,最后转成的原码即为结果
/*
1. 先将 2 转为补码,因为是正数,那么就是原码, int 为 4 字节, 则有 4*8=32 个 bit 位
00000000 00000000 00000000 00000010 注意,首位为符号位, 0 为正, 1 为负
2. 执行按位取反操作
11111111 11111111 11111111 11111101
3. 将上步运算结果转成原码
11111111 11111111 11111111 11111101 很明显,此补码为负数(符号位为 1 ),应先转为反码,再转为原码
11111111 11111111 11111111 11111100 转换成反码
10000000 00000000 00000000 00000011 转换成原码,数值位为 3 ,符号位为 1 ,为负数,则结果为 -3
*/
System.out.println(~2); // 输出 -3
//先将数字全部转成 2 进制补码,再做运算,最后转成的原码即为结果
int a = 3 << 4; // 相当于 3*2的4次幂,输出 48
int b = 55 >> 3; // 相当于 55/2/2/2,则为 27/2/2,13/2,输出 6
取模
a % b 当 a 为 小数 时,公式 = a - (int) a / b * b
int c = -10.5 % 3; // -10.5 - (-10)/3 * 3,先化简为 -10.5 + 10/3 * 3 再计算,输出 -1.5
int d = -10.4 % 3; // 输出 -1.4 的近似值