setbit(mapptr, pos)
register unsigned char *mapptr;
register int pos;
{
/* adjust word pointer and bit offset (pos) */
/************** FROM HERE ****************/
mapptr += pos / BITSPERBYTE;
pos %= BITSPERBYTE;
/*************** TO HERE ***************/
*mapptr |= 1 << pos; /* set bit */
}
wiss文件系统中有位操作代码我不明白(标有一对注释)。
为什么要将pos
划分为BITPERBYTE
(定义为8
)并将pos
操作为BITPERBYTE
?
答案 0 :(得分:2)
代码&#34;包&#34;位为字节的方式是位0..7进入字节0,8..15进入字节1,16..23进入字节2,依此类推。如果将位数除以8并删除余数,则最终会得到相应的字节数:
int byteNumber = bitNumber / BITSPERBYTE;
您的代码段将byteNumber
添加到mapptr
,这相当于通过指针算法索引字节数组。
% 8
的结果与获得最后三位相同,即从0到7的数字,包括0和7。这是相应字节中的位号:
int bitInByte = bitNumber % BITSPERBYTE;
%
的结果始终在0..BITSPERBYTE-1
范围内。
注意:您的代码是ANSI之前的版本,请考虑使用过去几十年标准的语法对其进行重写,并将pos
的类型更改为{{1} }:
unsigned
答案 1 :(得分:1)
您想在位图中设置位X.如果一个字节中有8位,
X/8
中(从0开始,整数数学=&gt;向零舍入,即向下舍入为正pos
)X%8
位(即删除我们在此计算中用于查找字节的组件)所以
mapptr += pos / BITSPERBYTE;
计算我们想要设置的位的字节偏移量,将其添加到指针,
pos %= BITSPERBYTE;
修改pos
以使用我们想要设置的字节索引该位;然后1 << pos
生成该位,我们'或'将它放入我们选择的字节中:
*mapptr |= 1 << pos; /* set bit */