int nibblemap[] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 };
1101,1100
{ 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);
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);
}
http://pan.baidu.com/share/link?shareid=216557&uk=453348606
第二版,可以加参数
super /dev/fd1
或super /dev/hd6