上次写了个IDCreateUtils,有点累赘,这次更新了一下,这个是通用版,直接给一个数字设置第start到第end位的值





package cn.kanmars;




/

  Created by baolong on 2015/12/1.

 
/

public class IDCreaterPlusUtils {

    /


     掩码制造,从0开始,包含start,包含end,start>=0,end<=63

    
@param start 0<=start<=63

     @param end   0<=end<=63

    
@return

     /

    public static long createMask(int start,int end) throws Exception{

        if(start <0 || start >63 ) throw new Exception(“IDCreaterPlusUtils createMask must: 0<=start<=63 “);

        if(end   <0 || end   >63 ) throw new Exception(“IDCreaterPlusUtils createMask must: 0<=end<=63 “);

        if(end < start) throw new Exception(“IDCreaterPlusUtils createMask must: end >= start”);

        long result = 0xffffffffffffffffl;

        result = result << (64-(end+1-start));

        result = result >>> start;

        return result;

    }



    /**

    
给old代表的64位数字中的第start到第end位,设置一个数字为val,如果val超出start和end的长度区间,则舍弃掉超出的内容

     @param old       原始数据

    
@param val       要设置进去的数据

     @param start     开始位置,0<=start<=end<=63,闭区间

    
@param end       结束位置,0<=start<=end<=63, 闭区间

     @return

    
@throws Exception

     /

    public static long setValue(long old,long val,int start,int end) throws Exception{

        if(start <0 || start >63 ) throw new Exception(“IDCreaterPlusUtils createMask must: 0<=start<=63 “);

        if(end   <0 || end   >63 ) throw new Exception(“IDCreaterPlusUtils createMask must: 0<=end<=63 “);

        if(end < start) throw new Exception(“IDCreaterPlusUtils createMask must: end >= start”);

        long result = old;

        long mask = createMask(start,end);

        result = result & (0xffffffffffffffffl ^ mask);//result与掩码的反码进行与操作,将指定位置为0

        long value = val;

        value = value << (64-(end+1-start));        //左移到指定位置

        value = value >>>  start;

        value = value & mask;                       //与掩码进行计算

        result = result | value;                    //将原值与新值进行组合

        return result;

    }





    /**

    
打印一个long的二进制码,不分割

     @param l

    
@return

     /

    public static String pl64(long l){

        return pl64(l,false);

    }

    /**

    
打印一个long的二进制码

     @param l    要打印的数值

    
@param split    是否每4位分割

     @return

    
/

    public static String pl64(long l,boolean split){

        StringBuilder sb = new StringBuilder();

        for(int i=0;i<64;i++){

            sb.append(pl(l, i));

            if((i+1)%4 ==0 && split){

                sb.append(“ “);

            }

        }

        sb.append(“\r\n”);

        return sb.toString();

    }

    /*

    
打印l 的从0开始第index位的数据

     @param l

    
@param index

     */

    public static String pl(long l,int index){

        return (0x0000000000000001L & (l>> (63-index)))+””;

    }



    public static void main(String[] args) throws Exception {

        //System.out.println(pl64(createMask(5,7)));

        long val = 0;

        val = setValue(val,15,3,6);

        System.out.println(pl64(val));

    }


}





package cn.kanmars;



import java.util.Date;



public class LongTransfer {

    

    /*char 62 ,

    
用来处理62进制

     /

    private static char[] info = {

        ’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,

            ’A’,’B’,’C’,’D’,’E’,’F’,’G’,’H’,’I’,’J’,’K’,’L’,’M’,’N’,’O’,’P’,’Q’,’R’,’S’,’T’,’U’,’V’,’W’,’X’,’Y’,’Z’,

            ’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’i’,’j’,’k’,’l’,’m’,’n’,’o’,’p’,’q’,’r’,’s’,’t’,’u’,’v’,’w’,’x’,’y’,’z’,

    };

    

    private static int jz = 62;

    

    public static void main(String[] args) {

         System.out.println(new Date(100,11,31));

        //long long的最大值:9223372036854775807

        //long long的最小值:-9223372036854775808

//        System.out.println(getStrFrom(9223372036854775807l));//hezMo7

//        System.out.println(getLongFrom(“aZl8N0y58M7”));

        

        for(int i=0;i<10;i++){

            long date = new Date(100,11,31).getTime();//获取1900+300 = 2200年的时间

            date = date/1000;

            String str = getStrFrom(date);

            long result = getLongFrom(str);

            System.out.print(date+”    “);

            System.out.print(str+”    “);

            System.out.print(result+”    “);

            System.out.println(“  “+(date==result?”true”:”false”));

            try {

                Thread.sleep(100);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

    public static String getStrFrom(long l){

        StringBuffer sb = new StringBuffer();

        if(l==0)return “0”;

        int jz = jz
;

        while(l/jz >= 0){

            if(l==0){

                //sb.insert(0, info[0]);

                break;

            }

            char c = info[(int)(l%jz)];

            //System.out.println((int)(l%62));

            sb.insert(0, c);

            l=l/jz;

        }

        return sb.toString();

    }

    public static long getLongFrom(String str){

        long result = 0;

        int jz = jz_;

        int strlength = str.length();

        char[] cc = new char[strlength];

        str.getChars(0, strlength, cc, 0);

        for(int i=0,j=strlength;i<j;i++ ){

            int num = -1;

            char c = cc[i];

            if(‘0’<=c&&c<=’9’){

                num = c-‘0’;

            }

            if(‘a’<=c&&c<=’z’){

                num = c-‘a’+10;

            }

            if(‘A’<=c&&c<=’Z’){

                num = c-‘A’+36;

            }

            //System.out.println(num);

            result = result
jz + num;

        }

        return result;

    }

}