import java.io.IOException;
public class Test2
{
public static void main(String[] args) throws IOException
{
// java 中 10 8 16进制常数的写法
System.out.println(512);
System.out.println(01000);
System.out.println(0x200);
System.out.println("=========================================>");
// 对于负数有符号位移和无符号位移有差别
// 有符号位移会自动高位补1,无符号将补0,
// 也就是说-1有符号右移1位为-1,无符号右移1位为integer最大值
System.out.println((-1 >> 1) == (-1 >>> 1));
System.out.println("=========================================>");
// 打印src的 2 4 8 16 32进制
int src = -5;
System.out.println(toUnsignedString(src, 1));
System.out.println(toUnsignedString(src, 2));
System.out.println(toUnsignedString(src, 3));
System.out.println(toUnsignedString(src, 4));
System.out.println(toUnsignedString(src, 5));
System.out.println("=========================================>");
//正负数转换的方法
src = -100;
System.out.println(-src);
System.out.println(conversion(src));
System.out.println("=========================================>");
//char 可以参加运算实际上是由于他存储的是整数
//而由于char是无符号的,所以需要17位来表示,
//所以才会看起来像int
System.out.println('㮆');
System.out.println(((char)-50298));
System.out.println("=========================================>");
//减减的实现方式
//由于计算机不存在减法,减法也是用加法算的
//所以一个整数加上这个整数类型的无符号最大值
//就相当于是自减,有符号的看起来像是加了一个
//-1,但计算机并没有负数的概念
int x = 355;
System.out.println(--x);
System.out.println((((x + 255) & 0xff) + (0xffffff00 & x)));
System.out.println(x + 0xffffffff);
System.out.println("=========================================>");
}
public final static char[] digits =
{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c',
'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
};
/**
* 无符号进制转换
*
* <p>
* 每次取出传入 i 的最后 shift 位,并将该值转化为10进制的值进行查表<br>
* 最后以倒叙的型式组成字符串
*
* @param i 需要转换的整数
* @param shift 表示偏移量,1为2进制,2为4进制,3为8进制,4为16进制, 5为32进制
* @return 表示该进制型式的字符串
*/
public static String toUnsignedString(int i, final/*此处final仅在编译期有效*/ int shift)
{
// 该字符数组用来保存每一位的字符表现型式
char[] buf = new char[32];
// 字符指针,表示转换后的第几位
int charPos = 32;
// 基数,表示该进制逢多少进1
int radix = 1 << shift;
// 掩码,表示该进制中的最大数的2进制型式
int mask = radix - 1;
// 以倒序的型式换算
//每次取shift表示的进制的位数
//并将该值转化为相应的进制型式字符
do
{
//假设该次为转换成2进制,那么每位最大值为1
//即mask为1,以i & mask 的结果就为 0 和 1
//所以在buf中,根据表digits只能有0和1的字符
buf[--charPos] = digits[i & mask];
i >>>= shift;
}
while (i != 0);
return new String(buf, charPos, (32 - charPos));
}
/**
* 正负数转换
* @param i 需要转换的数
* @return i 的相对数
*/
public static int conversion(int i)
{
return ~i + 1;
}
}