需要帮助解释wiss代码中的/和%的位操作

时间:2015-04-02 12:52:47

标签: c bitmap bit-manipulation

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

2 个答案:

答案 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将位于字节X/8中(从0开始,整数数学=&gt;向零舍入,即向下舍入为正pos
  • 它将是该字节的X%8位(即删除我们在此计算中用于查找字节的组件)

所以

mapptr += pos / BITSPERBYTE;

计算我们想要设置的位的字节偏移量,将其添加到指针,

pos %= BITSPERBYTE;

修改pos以使用我们想要设置的字节索引该位;然后1 << pos生成该位,我们'或'将它放入我们选择的字节中:

*mapptr |= 1 << pos;        /* set bit */