Java signed unsigned long 无符号数和有符号数之间的转换测试

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

运行结果截图

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页