进制转换和移位操作(移位-1)


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
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值