在Digital Equiment 的VAX计算机中,只有两种对位的操作函数:位设置bis和位清除bic。
其中bis(x, m)表示对于m中为1的位,置x对应的位为1. bic(x, m)正好相反,对于m中为1的位,置x对应的位为0。参数m有个更常用的称谓——掩码。对于掩码你一定不陌生,子网掩码、颜色掩码... 简单地说,掩码就是个过滤器,滤掉我们不希望得到的东西。
首先考虑一下位或的定义,两个参数的某一位至少有一为1则结果的对应位为1。那么我们该好好利用一下掩码了,我们要做x和y的位或,首先我们把x拿出来,令结果等于x(什么?这就结束了?当然不是)。我们还缺什么?x为0而y为1的那些位,结果应该为1。那我们就把y当做掩码,筛选掉y中为0的位,把y为1的位都赋值给结果(即使x已经将结果的改位赋值为1也不影响),就可完成位或的实现。
同样利用取反的定义和掩码的作用,我们可以简单得到对x(一个字长)位取反的做法:把0xFFFFFFFF(32位机)用x做掩码,过滤掉x为1的位。
其中bis(x, m)表示对于m中为1的位,置x对应的位为1. bic(x, m)正好相反,对于m中为1的位,置x对应的位为0。参数m有个更常用的称谓——掩码。对于掩码你一定不陌生,子网掩码、颜色掩码... 简单地说,掩码就是个过滤器,滤掉我们不希望得到的东西。
好了,扯远了,言归正传。
首先考虑一下位或的定义,两个参数的某一位至少有一为1则结果的对应位为1。那么我们该好好利用一下掩码了,我们要做x和y的位或,首先我们把x拿出来,令结果等于x(什么?这就结束了?当然不是)。我们还缺什么?x为0而y为1的那些位,结果应该为1。那我们就把y当做掩码,筛选掉y中为0的位,把y为1的位都赋值给结果(即使x已经将结果的改位赋值为1也不影响),就可完成位或的实现。
结果:bis(x, y)
同样利用取反的定义和掩码的作用,我们可以简单得到对x(一个字长)位取反的做法:把0xFFFFFFFF(32位机)用x做掩码,过滤掉x为1的位。