扩充63位long型数字为64位正BigDecimal (利用补码,可以将63位变为64位))
扩展63位long型数字为64位正BigDecimal (利用补码,可以将63位变为64位))
1. 前言。
如题。
2.代码
1. 前言。
如题。
2.代码
/** * 将long转为64位的BigDecimal * * @param a * @return */ public static BigDecimal longBigDecimal(long a) { System.out.println("解密前号码" + a); System.out.println("解密前二进制" + BigInteger.valueOf(a).toString(2)); if (a > 0) { return BigDecimal.valueOf(a); } else { // 溢出,负数肯定溢出,因为是自定义的 // 先转为byte01, // 1000000000000000000000000000000000000000000000000100100100001011//真正的数 // -111111111111111111111111111111111111111111111111011011011110101//原始数 // -000000000000000000000000000000000000000000000000100100100001010 // -9223372036854757109l // StringBuffer aString = new StringBuffer("1").append(BigInteger .valueOf(a).toString(2).replace("-", "")); boolean ifJinwei = false; // 补码运算。全部取反,再加1 for (int i = aString.length() - 1; i >= 1; i--) { char b = aString.toString().charAt(i); if (i == aString.length() - 1) { // 如果为0 ,48,那么必须进位 if (b == 48) { // 0取反是1,1加1进位为0 b = 48; ifJinwei = true; } else { // 1取反后是0,0+1是1 b = 49; ifJinwei = false; } } else { // 如果不是,那么 if (b == 48) { // 取反为1,如果有进位则1和1为零, if (ifJinwei) { b = 48; ifJinwei = true; } else { // 进位取反为1 b = 49; ifJinwei = false; } } else if (b == 49) { // 如果为1取反为0,有进位,则为1 if (ifJinwei) { // 有进位,0+1为1,不再进位 b = 49; ifJinwei = false; } else { // 如果为1取反为0 b = 48; ifJinwei = false; } } } aString.replace(i, i + 1, String.valueOf(b)); } String resultaString = aString.toString(); System.out.println("解密后:" + resultaString); String result = new BigInteger(resultaString, 2).toString(10); System.out.println("解密转换后:" + result); return new BigDecimal(result); } }