首页 > 代码库 > 用bis和bic实现位级操作

用bis和bic实现位级操作

       20世纪70年代末至80年代末,DigitalEquipmentVAX计算机是一种很流行的机型。它没有布尔运算ANDOR指令,只有bis(位设置)和bic(位清除)这两种指令。两种指令的输入都是一个数据字x和一个掩码字m。他们生成一个结果zz是有根据掩码m的位来修改x的位得到的。使用bis指令,可以在m1的每个位置上,将z对应的位置设为1。使用bic指令,可以在m1的每个位置上,将z对应的位置设为0
为了弄清bisbic运算与C语言位级运算的关系,假设我们有两个函数bisbic来实现位设置和位清除操作。只想用这两个函数,而不使用任何其他C语言运算,来实现按位|^运算,即或运算和异或运算。示例如下:

/*
定义两个运算函数*/

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;
}

首先来看(OR)运算的实现。先简单分析下bis运算的功能:
由给出的规则,可以得出如下示例:

bis([1001],[0110])= [1111];
bis([01010101],[10011011])=[11011111];

可以得出,对于掩码m中为1的位,无论x01,结果均为1,对于掩码m中位0的位,结果保持为x的值,即x1时,结果为1x0时,结果为0。这个与C语言中位级运算的或运算很相似,所以或运算对应的结果即bis(x,y);
异或运算的结果有些复杂,先来看一下其他的稍简单的几个位级运算。
位取反运算(~)
如果要对x取反,需将0置为1,1置为0bic函数当掩码为1时,可将结果该位置0,当掩码为0时,保持x值置结果该位。所以可以把x作为掩码,把全高位值0xFFFF作为bic函数的第一个参数,即可对x取反。取反运算的函数可以表示如下:

int bool_not(int x){
int result =bic(0xFFFF,x); 
//此处讨论的为16位机
  return result;
}

     与运算(AND)
     
由布尔代数可知:x& y = ~(~x | ~y),所以由刚得出的取反运算函数,可得出与运算的函数:

int bool_and(int x, int y){
  int result =bic(0xFFFF,bis(bic(0xFFFF,x),bic(0xFFFF, y));
  return result;
}

     下面探讨下位异或运算(XOR)
     
异或运算,只有当两个位不同时,结果才为1。用1位数位可以表示成如下示例:
  0^0= 0
  0^1 = 1
  1^0 = 1
  1^1 = 0

     
同样用1位数位表示最简单的bisbic函数,可以得出下面8个公式,这对于后面的分析很有用:
  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

     
注意上面标红的几个式子,恰好可以被我们利用:
     
对于bis函数,当两个位不同时,结果为1,而bic函数却取决于掩码的数值。对于bic函数,当两个位相同时,结果为0。所以可以得出下面几个式子:

bis(bic(0,1)bic(1,0))=bis(0,1)=1
bis(bic(1,0),bic(0,1))= bis(1,0)= 1
bis(bic(0,0),bic(0,0))= bis(0,0)= 0
bis(bic(1,1),bic(1,1))= bis(0,0)= 0

     这就是对于(0,1)(1,0)(0,0)(1,1)四对数位的异或运算结果。所以异或运算可写成如下形式:

int bool_xor(int x, int y){ 
  int result =bis(bic(x,y),bic(y,x));
  return result;
}


用bis和bic实现位级操作