现在有两个数字,一个取值范围是0到360的整数;另外一个取值范围是0到1之间的小数,但是为了节省空间,可以用0到100之间的整数来代表它。
    现在给定两个字节来表示这两个数字。第一个需要9个比特,第二个需要7个比特,因此16个bit够了。
    但是具体哪些比特代表哪个数字,这个未知。    假设用H表示第一个数字,S表示第二个数字,给出一些范例:
    H=220, S=0.6; 字节1=155, 字节2=152;
    H=240, S=0.6; 字节1=170,字节2=152;
    H=120, S=0.6; 字节1=141, 字节2=152;
    H=180, S=0.6; 字节1=127, 字节2=152;
    H=0,   S=1;   字节1=0,   字节2=254;    第一个字节不一定存放第一个数字。
    恳请高人指点。如果需要可以提供更多的范例。这两个字节应该没有经过加密。

解决方案 »

  1.   

    使用bit-Field
    具体的
    stuct _9_7_field
    {
       unsinged short a:9;
       unsinged short b:7;
    };
      

  2.   

    更正stuct改为struct.不好意思。
      

  3.   

        谢谢xyzhaopeng!
        现在是这样的,这些数字存放在一个字节数组(unsigned char *),如何读取到这个结构变量里? _9_7_field x;
            x=*((unsigned short *)hs);    但这样编译不过。
        error C2679: 二进制“=”: 没有找到接受“unsigned short”类型的右操作数的运算符(或没有可接受的转换) 请教?
      

  4.   

    呃,你的语法错了。
    应该是 _9_7_field* pX;
    pX = (_9_7_field*)hs;
    然后pX->a就是你第一个9比特的数。以此类推。
      

  5.   

    当然前提是,你的那个BYTE数组,要按照你说的这样的布局排。否则读出来,也不是你要的结果。
      

  6.   

    H=220, S=0.6; 字节1=155, 字节2=152
    unsinged short a =155;
    unsinged short b =152;
    unsinged short c =a<<7|b;
      

  7.   


        我的问题是哪些比特表示哪个数字,比如说一种可能是低地址的9个比特表示H,高地址的7个比特表示S,但也可能相反,即高地址的9个比特表示H,低地址的7个bit表示S,或者更复杂的表示方法。我估计可能要写算法判断一下。谢谢关注。    另外2楼给出的方法我也没见过。我想测试一下。新手,请见谅。           
      

  8.   

    H=220, S=0.6; 字节1=155, 字节2=152;
    举例:
    H        ==》 1101  1100
    S  == 60 ==》 0011  1100
    两个字节      1001  1000  1001  10011
    怎么多了1个1呢··楼主给个解释呗··谢谢
      

  9.   

    这个还不简单啊!最多就是一个错乱排序的问题。H=2的N次方,s=0.不就对出来了吗!!!!然后H=0,s=2的n次方。
      

  10.   

    H=220, S=0.6; 字节1=155, 字节2=152;
    举例:
    H ==》 1101 1100
    S == 60 ==》 0011 1100
    两个字节 1001 1000 1001 10011