免费注册 查看新帖 |

Chinaunix

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

[文件系统] 【转自csdn】linux-0.11调试教程,df.c源代码分析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-26 21:53 |只看该作者 |倒序浏览
int nibblemap[] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 };
1101,1100

3个1,2个1

如tmp=1101,1100b

nibblemap[tmp&0xf] + nibblemap[(tmp>>4)&0xf]=5

上面的可以算出1个字节有多少个1!


//count()算的是i节点位图或逻辑块位图中有多少个位为1?,numblocks是i节点位图块的块数或逻辑块位图块的块数

//numbits是i节点的总数或逻辑块的总数
ino_t count(unsigned numblocks, unsigned numbits)
{ unsigned i, j, end, sum = 0;
  char buf[BLOCK_SIZE];

  for (i=0; (i<numblocks) && numbits; i++)
  {
    if (read(fd,buf,sizeof(buf))<0)
      return(0);
    if (numbits >= (8*BLOCK_SIZE))
    {
      end = BLOCK_SIZE;
      numbits -= 8*BLOCK_SIZE;
    }
    else
    { int tmp;
      end = numbits >> 3;    //除8,1个字节8位
      numbits &= 0x7;        //取余,比如是100b既4个i节点,既最后一个字节的低4位
      tmp = buf[end] & ((1<<numbits)-1);//10000b-1=1111b取最后一个字节的低4位
      sum += nibblemap[tmp&0xf] + nibblemap[(tmp>>4)&0xf];//算最后一个字节多个个1!!!
      numbits = 0;
    }  
//算其他字节(除去最后一个字节buf[end])有多少个1
//如numbits大于8092则算buf[0]-buf[1023]共1024个字节8092个位中有几个1
    for (j=0; j<end; j++)
      sum += nibblemap[buf[j] & 0xf] + nibblemap[(buf[j]>>4)&0xf];
  }
  return(sum);
}
转自[url]http://blog.csdn.net/sitelist/article/details/8545412[/url]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP