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'
};
/**
* 进制转换(查表法)
* @param 待转换的10进制数
* @param shift 每次移位数
* @return 转换为对应进制的字符串
*/
static String trans(long i, int shift) {
char[] chs = new char[64]; //long类型数据占64个字节,定义一个一样大小的字符数组
int pos = 64; //因为每次都是移掉最后的shift位,
//所以查到的字符也是从字符数组最后一个位置开始存储
int radix = 1 << shift; //基数 比如十进制转二进制shift为1 得到的基数是2 其他进制类推
int mask = radix - 1; //掩码 为基数-1
//比如十进制(15)转八进制 每次将待转的十进制数(15)向右移掉3位
//八进制对应的基数是8 掩码是7
//第一次(二进制表示15)
//15: 1111
// 7: 111 掩码
// 111 查表得 '7'
//向右移掉3位,得到1
//第二次:
//1: 001
//7: 111
// 1 查表得 '1'
//此时结束循环 得到最终的结果"17"
do {
chs[--pos] = digits[(int)(i & mask)];
i >>>= shift;
} while(i != 0); //当前结果不为0 循环继续
return new String(chs, pos, 64-pos);
}
//这也是将十进制转为2进制的一种方法
public static void toBinary(long val) {
long x = val / 2;
long y = val % 2;
if(x != 0)
toBinary(x);
System.out.print(y);
}
//十进制转2进制 每次移动1位
public static String toBinaryString(long l) {
return trans(l, 1);
}
//十进制转8进制 每次移动3位
public static String toOctalString(long l) {
return trans(l, 3);
}
//十进制转16进制 每次移动4位
public static String toHexString(long l) {
return trans(l, 4);
}
/**
* -1 >>> -1
* -1向右移位(无符号)-1结果?
*
* -1 >>> 31
* -1向右移位(无符号)31 结果是1
*
* -1 >>> 32
* 计算过程
* 32 & 31 = 0 向右移动0位 结果仍为-1
*
* -1 >>> -1
* -1 & 31 = 31 向右移动31位 结果为1
*/
进制转换和移位操作(移位-1)
最新推荐文章于 2021-03-16 13:22:07 发布