PHP 两个数字合并成一个数字,且可以恢复成原来的两个数字

技术栈PHP

/**
 * 将 val 恢复成合并前的两个数
 * @param int $val 合并后的数
 * @return array 合并 $val 前的两个数
 */
function split_num(int $val): array
{
    $left = $val >> 32;
    $right = ($val << 32) >> 32;
    return [$left, $right];
}

/**
 * 将合并 left,right 成一个数
 * @param int $left
 * @param int $right
 * @return int $result left,right 合并后的数
 */
function merge_num(int $left, int $right): int
{
    if ($left < 0 || $right < 0) {
        //不支持负数合并
        throw new RuntimeException("not support negative to merge ");
    }
    if ($left > 2147483647 || $right > 2147483647) {
        //不支持负数合并
        throw new RuntimeException("The maximum value that is not supported");
    }
    $result = $left;
    $result <<= 32;
    $result |= $right;
    return $result;
}

技术栈JAVA

package com.worker;

public class AlgorithmTest {
    public static void main(String[] args) {
        test(Integer.MAX_VALUE,Integer.MAX_VALUE);
        test(123,143);
    }

    private static void test(int left ,int right){
        System.out.println("------test["+left+","+right+"]------");
        outBinary("left",left);
        outBinary("right",right);
        System.out.println("变化后的left" + left);
        System.out.println("变化后的right" + right);
        long mergeNum= mergeNum(left,right);
        outBinary("mergeNum",mergeNum);
        int[] splitNums = splitNum(mergeNum);
        System.out.printf("------mergeNum=%d,splitNum=[%d,%d]\r\n",mergeNum,splitNums[0],splitNums[1]);
    }

    /**
     * 将 val 恢复成合并前的两个数
     * @param val 合并后的数
     * @return 合并 val 前的两个数
     */
    private static int[] splitNum(long val){
        long left=val>>32;
        long right=(val<<32)>>32;
        return new int[]{Long.valueOf(left).intValue(),Long.valueOf(right).intValue()};
    }

    /**
     * 将合并 left,right 成一个数
     * @param left 用于合并的数1
     * @param right 用于合并的数2
     * @return left,right 合并后的数
     */
    private static long mergeNum(int left, int right){
        if(left<0||right<0){
            //不支持负数合并
            throw new RuntimeException("not support negative to merge ");
        }
        long result=left;
        result<<=32;
        result|=right;
        return result;
    }

    /**
     * 输出 val 的二进制值信息
     * @param prefix 输出日志前缀
     * @param val 要输出二进制的值
     */
    private static void outBinary(String prefix,long val){
        System.out.println(prefix+".val="+val);
        StringBuilder sb=new StringBuilder();
        int n=Long.numberOfLeadingZeros(val);
        for (int i = 0; i < n; i++) {
            sb.append(0);
        }
        String valBinaryStr=Long.toBinaryString(val);
        sb.append(valBinaryStr);
        System.out.println(prefix+".valBinaryStr = "+valBinaryStr);
        System.out.println(prefix+".valBinaryStr.length = "+valBinaryStr.length());
        System.out.println(prefix+".sb.toString() = "+sb.toString());
        System.out.println(prefix+".sb.length() = "+sb.length());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值