1.进制
对于整数 有四种表示方式
- 二进制:0,1 满2进1 以0b或0B开头表示
- 十进制:0-9 满10进1
- 八进制:0-7 满8进1 以数字0开头表示
- 十六进制:0-9及A(10)-F(15) 满16进1 以0x或0X开头表示 此处的A-F不区分大小写
public class BinaryText {
public static void main(String[] args){
int a = 1010;//十进制
int b = 0b1010;//二进制
int c = 01010;//八进制
int d = 0X1010;//十六进制
System.out.println("a = " + a);//输出为1010
System.out.println("b = " + b);//输出为10
System.out.println("c = " + c);//输出为520
System.out.println("d = " + d);//输出为4112
}
}
进制的转换(要掌握)
- 二进制转十进制 从最低位(右边)开始 将每个位上的数提取出来 乘2的(位数-1)次方,然后求和
- 八进制转十进制 从最低位(右边)开始 将每个位上的数提取出来 乘8的(位数-1)次方,然后求和
- 十六进制转十进制 从最低位(右边)开始 将每个位上的数提取出来 乘16的(位数-1)次方,然后求和
- 十进制转二进制 将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,得到对应的二进制
- 十进制转八进制 将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,得到对应的八进制
- 十进制转十六进制 将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,得到对应的十六进制
- 二进制转八进制 从低位开始,将二进制数每三位一组,转成对应的八进制数即可
- 二进制转十六进制 从低位开始,将二进制数每四位一组,转成对应的十六进制数即可
- 八进制转二进制 将八进制数每一位,转成对应的一个3位的二进制数即可
- 十六进制转二进制 将十六进制数每一位,转成对应的一个4位的二进制数即可
2.位运算
java中有7个位运算(&、|、^、~、>>、<<、>>>)
分别是按位与&、按位或|、按位异或^、按位取反~ 运算规则如下
- 按位与& 两位全为1,结果为1,否则为0
- 按位或| 两位有一个为1,结果为1,否则为0
- 按位异或^ 两位一个为0,一个为1,结果为1,否则为0
- 按位取反~ 0->1 1->0
- 算术右移>> 低位溢出,符号位不变,并用符号位补溢出的高位
- 算术左移<< 符号位不变,低位补0
- 无符号右移(逻辑右移)>>> 低位溢出,高位补0
- 无<<<符号
eg:
int a = 1 >> 2;
int c = 1 << 2;
掌握以上即可,不用再进一步深入
3.原码、反码、补码(重点、难点、必背)
- 二进制的最高位是符号位:0表示整数,1表示负数(记忆:0->0 1->- 九十度旋转 0还是0 1变-)
- 正数的原码,反码,补码都一样(三码合一)
- 负数的反码 = 它的原码符号位不变,其它位取反(0->1, 1->0)
- 负数的补码 = 它的反码+1,负数的反码 = 负数的补码-1
- 0的反码,补码都是0
- java没有无符号数,换言之,java中的数都是有符号的
- 在计算机运算的时候,都是以补码的方式来运算的(补码将正数和负数统一起来,高超的设计)
- 我们查看运算结果的时候,要看它的原码
eg:
public class BitOperator {
public static void main(String[] args) {
//2 & 3
//运算过程如下
//1.得到2的原码 00000000 00000000 00000000 00000010
// 得到2的补码 00000000 00000000 00000000 00000010
// 得到3的原码 00000000 00000000 00000000 00000011
// 得到3的补码 00000000 00000000 00000000 00000011
//2.运算2 & 3 00000000 00000000 00000000 00000010
//3.得到运算后补码的原码
// 00000000 00000000 00000000 00000010
//所以结果为2
System.out.println(2 & 3);
}
}
public class BitOperator {
public static void main(String[] args) {
//运算 2 | 3
//1.先得到2的原码 00000000 00000000 00000000 00000010
// 再得到2的补码 00000000 00000000 00000000 00000010
// 先得到3的原码 00000000 00000000 00000000 00000011
// 再得到3的补码 00000000 00000000 00000000 00000011
// 按位或运算 00000000 00000000 00000000 00000011
// 再得到该补码的原码
// 00000000 00000000 00000000 00000011
// 输出3
System.out.println(2 | 3);
}
}