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

运行结果截图


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java hashmap一个简单的for循环,竟然都可以给写成死循环,真佩服写这代码的人。知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。