免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2411 | 回复: 4
打印 上一主题 下一主题

[c]实现位图 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-27 18:32 |只看该作者 |倒序浏览
本帖最后由 liangzhishao 于 2011-12-27 21:56 编辑

   假设需要一个位图用来存储一个用户(A)的日期分布. 如果只保留60天的话, 那么用long long就
够用了
  1. flag >>= 1; //删除一天
  2. if(用户A今天出现)
  3.    flag |= (1ll<<59); //新增一天

  4. //统计出现天数
  5. while(flag)
  6. {
  7.    if(flag & 1)
  8.      validbit++;
  9.    flag >>= 1;
  10. }
复制代码
现在需要保存100天的, 怎么做呢?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2011-12-27 19:41 |只看该作者
你的意思是想要个 100bits 的数据类型 ?
C++的话用 std::bitset
C的话用 unsigned char[ (100+7)/8 ] 简单,用 unsigned int[ (100+sizeof(unsigned int)-1)/sizeof(unsigned int) ] 高效

论坛徽章:
0
3 [报告]
发表于 2011-12-27 22:07 |只看该作者
太大

论坛徽章:
0
4 [报告]
发表于 2011-12-28 01:58 |只看该作者
    刚写的,  还不知道正确不正确, 在我的机器上可以运行, 感兴趣的帮看看,
统计出现次数的功能还没有编写.....
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. typedef struct _state {
  5.   unsigned char input[13];
  6.   unsigned char output[13];
  7.   int ining;
  8.   int outing;
  9.   unsigned short bi_buf;
  10.   int bi_valid;
  11. } state;

  12. void send_bits(state *s, unsigned char value, int len)
  13. {
  14.   int rm = 16 - s->bi_valid;
  15.   if(len > rm)
  16.   {
  17.     unsigned short val = value;
  18.     s->bi_buf <<= rm;
  19.     s->bi_buf |=  val>>(8-rm);
  20.     //MSB first
  21.     s->output[s->outing++] = (unsigned char)((s->bi_buf) >> 8);
  22.     s->output[s->outing++] = (unsigned char)((s->bi_buf) & 0xff);
  23.    
  24.     s->bi_buf = val << rm;
  25.     s->bi_valid = len - rm;
  26.   }
  27.   else
  28.   {
  29.     s->bi_buf <<= len;
  30.     s->bi_buf |= value & (1<<len)-1;
  31.     s->bi_valid += len;
  32.   }
  33.   return;
  34. }

  35. void fflush_bits(state *s)
  36. {
  37.   if(s->bi_valid > 8)
  38.   {
  39.     //MSB first
  40.     s->output[s->outing++] = (unsigned char)((s->bi_buf) >> 8);
  41.     s->output[s->outing++] = (unsigned char)((s->bi_buf) & 0xff);
  42.   }
  43.   else
  44.   {
  45.     s->output[s->outing++] = (unsigned char)((s->bi_buf) & ((1<<s->bi_valid) - 1));
  46.   }
  47.   s->bi_buf = 0;
  48.   s->bi_valid = 0;
  49.   return;
  50. }

  51. int main()
  52. {
  53.   state *s;
  54.   s = calloc(1, sizeof(state));

  55.   strcpy(s->input, "123456789abc");

  56.   unsigned char ch;
  57.   
  58.   //删除一天
  59.   ch = s->input[s->ining++];
  60.   send_bits(s, ch, 7);
  61.   
  62.   while(s->ining < strlen(s->input))
  63.   {
  64.     ch = s->input[s->ining++];
  65.     send_bits(s, ch, 8);
  66.   }
  67.   
  68.   //新增一天, 假设1
  69.   if(1)
  70.   {
  71.     send_bits(s, 0x8, 1);
  72.   }
  73.   else
  74.   {
  75.     send_bits(s, 0x0, 1);
  76.   }
  77.   
  78.   //清空buf
  79.   fflush_bits(s);
  80.   
  81.   int i;
  82.   for(i = 0; i < strlen(s->input); i++)
  83.   {
  84.     printf("%02hhx ", s->output[i]);
  85.   }
  86.   printf("%02hhx\n", s->output[i]);
  87.    
  88.   return(0);
  89. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-12-28 08:22 |只看该作者
如果只是要位图的话,有现成的fd_set可以使用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP