现在有C的表达式 i64 = ((__int64)(*(ob+20))<<32);
如何将它转换为用java语言表示的表达式?  
因为_int64是64位的数据类型,所以很难在java中找到转换的。

解决方案 »

  1.   


    public class testJe {
        public static void main(String[] args) {
            //4294967296
            
            byte[] ob = new byte[]{0,50,0,17,33,64,-83,118,-2,-15,0,0,13,-7,127,0,68,-26,22,13,1,-86,98,39,1,1,14,0,0,0,0,0,0,0};
            byte[] tob = copyBrr(ob, 20);
            
            
            long iii =   (unsigned4BytesToInt(copyBrr(ob, 20), 0) << 32)&0xFFFFFFFFL; 
            System.out.println(iii);
            
        }
        
        
        public static byte[] copyBrr(byte[] inBrr,int n){
            byte[] outBrr=null;
            //容错处理
            if(null==inBrr){
                return null;
            }else{
                if(n>=0&&n<inBrr.length){
                    outBrr=new byte[inBrr.length-n];
                    //outArr=Arrays.copyOfRange(inArr, n,inArr.length); //jdk1.4中无此方法
                    for(int i=0;i<outBrr.length;i++){
                        outBrr[i]=inBrr[n+i];
                    }
                }else if(n<0){
                    outBrr = inBrr;
                }else if(n>inBrr.length){
                    outBrr = null;
                }
            }
            return outBrr;
        }
        
        
        
        
          public static long unsigned4BytesToInt(byte buf[], int index) {  
            int firstByte = (0x000000FF & ((int) buf[index]));
            int secondByte = (0x000000FF & ((int) buf[index + 1]));
            int thirdByte = (0x000000FF & ((int) buf[index + 2]));
            int fourthByte = (0x000000FF & ((int) buf[index + 3])); 
            long unsignedLong = ((long) (firstByte | secondByte << 8 | thirdByte << 16 | fourthByte << 24)) & 0xFFFFFFFFL;  
            return unsignedLong;
        }
    曾这样写过,但遇到大的数,这样转换就不对了
      

  2.   

    用long来对应
    long i64 = (long)(ob[20]<<32); //*(ob+20)相当于数组的ob[20]
      

  3.   


    应该是 long i64 = (long)ob[20]<<32;
    强制类型转换优先级高于 位移运算符
      

  4.   

    long iii =   (unsigned4BytesToInt(copyBrr(ob, 20), 0) << 32)&0xFFFFFFFFL; 这一行是要干神马?难道iii 的结果不是恒为0吗?
      

  5.   

    为什么不对,有没有仔细想过?你是先 |,再强行转换为long,这样如果是负数的话(超过了int范围),转成long也就变成了负数,所以要先转成long,再 |即
    long unsignedLong = ((long) (firstByte | secondByte << 8 | thirdByte << 16 | fourthByte << 24)) & 0xFFFFFFFFL;改成
    long unsignedLong = (firstByte & 0xFFFFFFFFL) | ((secondByte & 0xFFFFFFFFL) << 8) | ((thirdByte & 0xFFFFFFFL) << 16) | ((fourthByte & 0xFFFFFFFL) << 24);LZ好好想想其中的区别
      

  6.   

    long iii = (unsigned4BytesToInt(copyBrr(ob, 20), 0) << 32)&0xFFFFFFFFL;  
    是不是后面少写了8个F啊?
    long iii = (unsigned4BytesToInt(copyBrr(ob, 20), 0) << 32)&0xFFFFFFFFFFFFFFFFL;  ?
      

  7.   

    long iii =   (unsigned4BytesToInt(copyBrr(ob, 20), 0)<< 32)&0xFFFFFFFFFFFFFFFFL; 
            System.out.println(Long.toBinaryString(iii));结果:10011101100010101010100000000100000000000000000000000000000000,这是你期望得到的结果吗?
      

  8.   


    8好意思,这里说错了,|运算不会发生进位,把|运算相当然成+运算,所以最后的结果 &0xffffffffL是没问题的int a = Integer.MAX_VALUE + 1;
    int b = Integer.MAX_VALUE + 1;
    long c = (a | b) & 0xffffffffL; //把|改成+就不一样了
    System.out.println(c);
    long d = (a & 0xffffffffL) | (b & 0xffffffffL); //把|改成+就不一样了
    System.out.println(d);