我有一个4字节的数组 里面的前30bit包含了一个9位数的数字,请问我怎么移位取出来阿?
public static void main(String[] args) throws IOException {

byte [] a = { (byte) -60, (byte) 23, (byte) -46, (byte) 8 };
//int b = (int) new DataInputStream(new ByteArrayInputStream(a)).readInt();

// 移位

System.out.println(b); }
比如变量a这4个字节的中 前30bit包含了一个9位数字 我不知道怎么移位能得到这30bit 如何得到这个9位数
取完了以后 还剩下2bit 在字节{(byte)8} 里面 下一个字节是{(byte)23} 
有一个数据是4bit 包含在{(byte)8}的剩下2bit和{(byte)23}开头2bit里面  这4bit的数据又怎么取出来阿?我在网上看了很多移位的 实在搞不懂,随发帖求助!谢谢大家...

解决方案 »

  1.   

    我的帖子怎么又沉了阿 来个大大帮帮忙阿.. help...
      

  2.   

    byte [] a = { (byte) -60, (byte) 23, (byte) -46, (byte) 8 }; 
    int b = 0;       
    for (int i=0; i<a.length; i++) {
        b = (b<<4) & a[i];
    }
    b &= 0xfffffffc; //取左边30bit
    System.out.println(b);
      

  3.   

    byte [] a = { (byte) -60, (byte) 23, (byte) -46, (byte) 8 }; 
    int b = 0;       
    for (int i=0; i<a.length; i++) {
        b = (b<<8) & a[i]; //应该是左移8位
    }
    b &= 0xfffffffc; //取左边30bit
    System.out.println(b);
      

  4.   

    不知道你所谓的取前30bit是什么意思?
    是 &0xfffffffc,即保持位数不变,最后2位清0,还是说整体右移2位(也就是去掉最后两位)
    byte [] a = { (byte) -60, (byte) 23, (byte) -46, (byte) 8 }; 
    int b = 0;       
    for (int i=0; i<a.length; i++) {
        b = (b<<8) | (a[i] & 0x0ff); 
    }long c = b & 0x0fffffffcL; //保持位数不变,最后2位清0
    System.out.printf("%x\n", c);
    System.out.println(c); //这样得到的数可能会超过9位数,可能不是这个结果b >>>= 2; //整体右移2位,即去掉后2位,保留30bit
    System.out.printf("%x\n", b);
    System.out.println(b); //这样得到的是一个9位数,可能是这个结果,LZ再自己check一下
      

  5.   


    你好 谢谢解答byte [] a = { (byte) -60, (byte) 23, (byte) -46, (byte) 8 };  也就是 byte [] a = { -60, 23, -46, 8 }; a在这里占用4个字节 也就是32bit 这32bit里面 前30bit表示一个属性 后2bit表示另外一个属性所以我需要把这32bit的数据分别取出来...