• 从一个数组中提取出第start位到第end位


    假设通过数组in来表示一个很大的数(in[0]表示最低bit),提取该数的第start位到第end位(计数起始位为0):

     1 #define MAX_BYTE_LEN    ( 48 )
     2 int getDataFromBitStartToEnd(unsigned char *in, unsigned char *out, int start, int end)
     3 {
     4     int i, cnt;
     5     unsigned char mask[MAX_BYTE_LEN];
     6     // 清除第n位之前的位
     7     unsigned char xx[8] = {0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};
     8     // 清除第n位后面的位
     9     unsigned char yy[8] = {0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00};
    10     int byte_start, byte_end;
    11     
    12     memset(mask, 0x00, sizeof(mask));
    13     
    14     #if 0    // 这种计算方法在两字节(如:bit15~bit16)的边界就会出现错误
    15         cnt = end - start + 1; // 位总数
    16         cnt = (cnt + 7) / 8; // 字节总数
    17         for(i = 0; i < cnt; i++)
    18         {
    19             mask[start/8+i] = 0xff;
    20         }
    21     #endif
    22     
    23     byte_start = start / 8;
    24     byte_end   = end / 8;
    25     for(i = byte_start; i <= byte_end; i++)
    26     {
    27         mask[i] = 0xff;
    28     }
    29     
    30     
    31     // 前面mask的位可能会把"start之前"/"end之后"的一些位也mask上了
    32     mask[start/8] &= ~xx[start%8]; // 清除起始之前多余的bit
    33     mask[  end/8] &= ~yy[  end%8]; // 清除结束之后多余的bit
    34     
    35     for(i = 0; i < MAX_BYTE_LEN; i++)
    36     {
    37         out[i] = in[i] & mask[i];    
    38     }
    39     
    40     return 0;
    41 }
  • 相关阅读:
    关于抽象类
    封装.继承.多态
    构造方法
    String
    无参方法与有参方法
    类和对象
    使用分层实现业务处理(二)
    使用分层实现业务处理(一)
    序列化Serializable接口
    用JSP从数据库中读取图片并显示在网页上
  • 原文地址:https://www.cnblogs.com/utank/p/5570620.html
Copyright © 2020-2023  润新知