写法:
int a = 0b11111111111111111111111111111110; //2进制
int b = 0xfffffffe; //缩写为16进制
int c = 037777777776; //缩写为8进制 从右边起三个一组 最大不超过7
System.out.println(a);
System.out.println(b);
System.out.println(c);
左右移符号一般用法及实际应用:
System.out.println(a>>1); //-1
System.out.println(a<<1); //-4
System.out.println(a>>>1); //逻辑右移 最高位补零 得到 Integer.MAX
System.out.println(Integer.MAX_VALUE);
//应用
RandomAccessFile raf = new RandomAccessFile("raf_p.dat", "rw");
raf.write(a>>>24);
raf.write(a>>>16);
raf.write(a>>>8);
raf.write(a);
raf.seek(0);
int b1=raf.read();
int b2=raf.read();
int b3=raf.read();
int b4=raf.read();
a = b1<<24|b2<<16|b3<<8|b4;
System.out.println(a); //-2
raf.seek(0);
System.out.println(raf.readInt()); //-2
补码机制的验证:
long max=Long.MAX_VALUE;
long min=Long.MIN_VALUE;
System.out.println(Long.toBinaryString(max)); //63个1 最高位为0省略
System.out.println(Long.toBinaryString(min)); //最高位为1 后面63个0
System.out.println(Long.toBinaryString(-1)); //64个1
System.out.println(Long.toBinaryString(-2)); //64个1 最后一位为0
取反对称机制的验证:
//取反对称的验证 -n=~n+1
System.out.println(max);
System.out.println(-(~max+1)); //max
System.out.println(~255+1); //-255
System.out.println(~(-128)+1); //128
System.out.println(-1);
System.out.println(~1+1); //-1
System.out.println(min);
System.out.println(-(~min+1)); //min
System.out.println(-min); //仍为min
System.out.println(~min+1); //为-min? 结果仍为min
取余运算的高阶转换:
//取余运算的高阶转换
for (int i = 0; i < 100; i++) {
System.out.print(i%16+",");
System.out.println(i&0xf); //也可以写成15,4位掩码,上下完全一致
}
Unicode的编码拼接:
//Unicode的编码拼接
System.out.println(Integer.toBinaryString('人'));
//可知人的Unicode 16位编码为01001110 10111010
int code = '人';
//UTF-8“图纸”编码规则
//1110XXXX 10XXXXXX 10XXXXXX 3字节编码
//0xe0 0x80 0x80
//转换成3字节 utf-8编码
int c1 = (code>>>12)|0xe0;
int c2 = ((code>>>6)&0x3f)|0x80;
int c3 = (code&0x3f)|0x80;
//拼回
int ch = ((c1&0xf)<<12)|((c2&0x3f)<<6)|(c3&0x3f);
char human = (char)ch;
System.out.println(human);
utf-8编码 rfc3629文档说明:
https://datatracker.ietf.org/doc/rfc3629/
经典面试题: