Java 中的long类型是64位,即64个二进制位在一起来表示一个数,但是64个bit位中,最顶上1个bit是标志位,用来表示正负数的,所以,他能表示的最大的正数,就是63个1,带上最高位是0,然而其他的平台是可以把64位全部用来表示数字的。没有把最高位当作标记位来用。怎么把这个无符号的数字变成Java能表示的long呢?
package com.lxk.jdk.common;
import org.junit.Test;
import java.math.BigDecimal;
/**
* @author LiXuekai on 2021/4/28
*/
public class LongTest {
/**
* 无符号64个1 unsigned long 数字
*/
private static final String s = "18446744073709551615";
@Test
public void MaxAndMin() {
outLongInfo(Long.MAX_VALUE);
outLongInfo(Long.MIN_VALUE);
}
@Test
public void test() {
// 大于MAX,是无符号正数,但,还是64位的。
outLongInfo(unsigned2Long1(s));
outLongInfo(unsigned2Long2(s));
System.out.println(longParseUnsigned(-216172773253120239L));
System.out.println(longParseUnsigned(-1));
}
/**
* 打印long的 value 二进制value 二进制value长度
*
* @param aLong java long value
*/
private void outLongInfo(long aLong) {
System.out.println(" long value is \t" + aLong);
System.out.println(" long binary value is \t" + Long.toBinaryString(aLong));
System.out.println("long binary value length is \t" + Long.toBinaryString(aLong).length());
}
/**
* 方法1:unsigned long 2 signed long
*
* @param s unsigned long string
*/
private long unsigned2Long1(String s) {
return Long.parseUnsignedLong(s);
}
/**
* 方法2:unsigned long 2 signed long
*
* @param s unsigned long string
*/
private long unsigned2Long2(String s) {
return new BigDecimal(s).longValue();
}
/**
* long转成无符号数
*/
public static BigDecimal longParseUnsigned(long value) {
if (value >= 0) {
return new BigDecimal(value);
}
// 按位与操作,就是把负数给转成相应的正数,比如-10 转成 10
long lowValue = value & Long.MAX_VALUE;
// 然后再左移 1 位,然后在最低位 + 1 。跟下面的 dd() 一样的逻辑。
return BigDecimal.valueOf(lowValue).add(BigDecimal.valueOf(Long.MAX_VALUE)).add(BigDecimal.valueOf(1));
}
@Test
public void dd() {
// 乘以2,相当于左移 1 位,最后一位是0,然后再加个1,就64个1了。
BigDecimal multiply = new BigDecimal(Long.MAX_VALUE).multiply(new BigDecimal(2));
System.out.println("Long.MAX_VALUE * 2 = " + multiply.toPlainString());
BigDecimal subtract = multiply.add(new BigDecimal(1));
System.out.println("Long.MAX_VALUE * 2 + 1 = " + subtract.toPlainString());
System.out.println("64 个 1 的 无符号数 = " + s);
}
}
运行结果截图