扩展63位long型数字为64位正BigDecimal (利用补码,可以将63位变为64位))

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);

		}
	}


猜你喜欢

转载自nannan408.iteye.com/blog/2056152