J2ME float 处理

转自: hi Fkama 

http://hi.baidu.com/hi%5Fkama/blog/item/7fcea10f8ac2eaefab6457f8.html

 

CLDC1.0中不支持float,自己处理了一下: 

public static int Bytes4ToInt(byte abyte0[])
{
    return (0xff & abyte0[0]) << 24 | (0xff & abyte0[1]) << 16 |
    (0xff & abyte0[2]) << 8 | 0xff & abyte0[3];
}

public static int[][] intBitsToFloatII(int bits,int flag)
{
    long time = System.currentTimeMillis();
    // 符号位一位
    int sign = bits >>> 31;
    System.out.println("符号:" + sign);

    // 指数八位 偏移:7FH
    byte index = (byte)((byte)((bits >>> 23) & 0xFF) – 0x7F);

    // 尾数23尾 加一位固定位
    int tail = (bits & 0x007FFFFF) | 0x00800000;
    tail <<= index;

    int[][] result = new int[1][1];
    result[0][0] = tail >>> 23;
    System.out.println("整数部分:" + result[0][0]);

    // 小数23位
    int decimal = tail & 0x007FFFFF;
    long tmp = decimal * 1000;
    tmp = tmp >>> 23;
    System.out.println("小数部分[放大1000]:" + tmp);  

    result[0][0] = (int)tmp;

    System.out.println("小数部分:" + tmp);

    System.out.println("系统函数计算结果:" + Float.intBitsToFloat(bits));
    System.out.println("耗时:" + (System.currentTimeMillis() – time) + "ms");
    return result;
}

/**
 * 整型位字节转float
 *
 * @param bits
 *            int 整型字节数据
 * @param flag
 *            int 精度:0:2位小数;1:3位小数
 * @return int[][] [整数][小数]
 */
public static int[][] intBitsToFloat(int bits,int flag)
{
    long time = System.currentTimeMillis();
    // 符号位一位
    int sign = bits >>> 31;
    System.out.println("符号:" + sign);

    // 指数八位 偏移:7FH
    byte index = (byte)((byte)((bits >>> 23) & 0xFF) – 0x7F);

    // 尾数23尾 加一位固定位
    int tail = (bits & 0x007FFFFF) | 0x00800000;
    tail <<= index;

    int[][] result = new int[1][1];
    result[0][0] = tail >>> 23;
    System.out.println("整数部分:" + result[0][0]);

    // 小数23位
    int decimal = tail & 0x007FFFFF;
    decimal = (decimal * 100) >>> 23;
    int decRes = decimal;
    int tmp;
// if (flag == 0)//精度:两位小数
// {
// decRes /= 100;
// tmp = decRes % 100;
// if (tmp >= 50)
// {
// decRes++;
// }
// }
// else
// {
// decRes /= 10;
// tmp = decRes % 10;
// if (tmp >= 500)
// {
// decRes++;
// }
// }
    result[0][0] = decRes;

    System.out.println("小数部分:" + decRes);

    System.out.println("系统函数计算结果:" + Float.intBitsToFloat(bits));
    System.out.println("耗时:" + (System.currentTimeMillis() – time) + "ms");
    return result;
}

////////////////////////////////

调用:

              byte[] tt = new byte[4];
              tt[0] = bb[17];
              tt[1] = bb[16];
              tt[2] = bb[15];
              tt[3] = bb[14];
              for (int i = 0; i < tt.length; i++)
              {
//                  System.out.println(this.b2h(tt[i]));
              }

              int ff = Bytes4ToInt(tt);
              this.intBitsToFloat(ff,0);

//注意网络字节顺序