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


  • 相关阅读:
    ZOJ 3609 Modular Inverse (水题)
    ZOJ 3607 Lazier Salesgirl (贪心)
    POJ 1730 Perfect Pth Powers (枚举||分解质因子)
    POJ 2262 Goldbach's Conjecture (素数判断)
    LA 3135 Argus (优先队列)
    uva 11991 (map vector 嵌套)
    hdu 1022 Train Problem I(stack)
    poj 1837 blance (01背包)
    hdu 1242 rescue (优先队列 bfs)
    hdu 3033 I love sneakers!(分组背包)
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7102021.html
Copyright © 2020-2023  润新知