练习2.13
20世纪70年代末至80年代末,DigitalEquipment的VAX计算机是一种非常流行的机型。它没有布尔运算AND和OR指令,仅仅有bis(位设置)和bic(位清除)这两种指令。两种指令的输入都是一个数据字x和一个掩码字m。
他们生成一个结果z。z是有依据掩码m的位来改动x的位得到的。使用bis指令。能够在m为1的每一个位置上,将z相应的位置设为1。
使用bic指令。能够在m为1的每一个位置上,将z相应的位置设为0。
为了弄清bis和bic运算与C语言位级运算的关系,如果我们有两个函数bis和bic来实现位设置和位清除操作。仅仅想用这两个函数,而不使用不论什么其它C语言运算,来实现按位|和^运算,即或运算和异或运算。bis等价于or,bic(x,m)等价于x&~m。x^y=(x&~y)|(~x&y)
示比例如以下:
/*定义两个运算函数*/
int bis(intx, int m);
intbic(int x, int m);
/*或运算的实现*/
intbool_or(int x, int y){
int result = _______;
return result;
}
/*异或运算的实现*/int
bool_xor(int x, int y){
int result = ______;
return result;
}
对bis的理解
e.g. bis([1001],[1101])=[1101];
将掩码m中为一的位,不论x为0或为1,都将其置一;
相当于或运算
对bic的理解
e.g.([10011001],[11101000])=[00010001];
将掩码m中为一的位,不论x为0或为1,都将其置零;
相当于先将掩码取反 使其原来为1的位变为0 然后与x取并
bis(0,0)=0; bis(0,1)=1; bis(1,0)=1; bis(1,1)=1;
bic(0,0)=0; bic(0,1)=0; bic(1,0)=1; bic(1,1)=0;
异或运算
x^y=(x&~y)!(y&~x)
x^y=bis(bic(x,y),bic(y,x))