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语言运算,来实现按位|和^运算,即或运算和异或运算。

示比例如以下:



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

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的位,不管x为0或1。结果均为1,对于掩码m中位0的位,结果保持为x的值。即x为1时。结果为1,x为0时。结果为0。

这个与C语言中位级运算的或运算非常相似。所以或运算相应的结果即bis(x,y);

异或运算的结果有些复杂,先来看一下其它的稍简单的几个位级运算。

位取反运算(~)

假设要对x取反。需将0置为1,1置为0。bic函数当掩码为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位数位表示最简单的bis和bic函数。能够得出以下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实现位级操作的更多相关文章

  1. bis和bic命令实现或和异或运算

    从20世纪70年代末到80年代末,Digital Equipment的VAX计算机是一种非常流行的机型.它没有布尔运算AND和OR指令,只有bis(位设置)和bic(位清除)这两种指令.两种指令的输入 ...

  2. STM32之GPIO端口位带操作

    #ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" //位带操作 //把“位带地址+位序号”转换别名地址宏 #define ...

  3. Matlab位运算操作

    本文为转载他人文章: bitand 按位与操作 a = 7; b = bitand(10,a); disp(dec2bin(a,8)); %ans = 00000111 disp(dec2bin(b, ...

  4. STM32位带操作总结---浅显易懂

    正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能 ...

  5. STM32F030系列实现仿位带操作

    1.闲言 最近开发的时候,用到了STM32F030F4P6型号的单片机,它只有20个引脚,价格非常便宜,但是功能齐全:定时器.外部中断.串口.IIC.SPI.DMA和WWDG等等,应用尽有,非常适合用 ...

  6. 第13章 GPIO—位带操作

    第13章     GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  7. 玩转X-CTR100 l STM32F4 l 基础例程printf、LED、蜂鸣器、拨码开关、位带操作

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器基础板载资源 ...

  8. 玩转X-CTR100 | STM32F4 l GPIO位带操作

    更多塔克创新资讯欢迎登陆[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]       STM32F4位带概念,及位带的GPIO操作实践应用. 原理介 ...

  9. 关于STM32位带操作随笔

    以前在学习STM32时候关注过STM32的位带操作,那时候只是知道位带是啥,用来干嘛用,说句心里话,并没有深入去学习,知其然而不知其所以然.但一直在心中存在疑惑,故今日便仔细看了一下,写下心得供日后参 ...

随机推荐

  1. <Spring Cloud>入门六 Zuul

    1.Zuul 2.操作 2.1 pom <?xml version="1.0" encoding="UTF-8"?> <project xml ...

  2. thinkphp5 自定义验证码使用

    控制器[https://blog.csdn.net/John_rush/article/details/80169702] public function verify(){ $captcha = n ...

  3. 蓝牙bluez学习(1) Stack Architecture

    Bluez支持的features Core Specification 4.2 (GAP, L2CAP, RFCOMM, SDP, GATT) Classic Bluetooth (BR/EDR) B ...

  4. Mac下复制粘贴的快捷键是什么?随记

    刚从window换成Mac OS系统的用户对于一些常用的快捷键一定非常的不习惯,“mac复制粘贴快捷键是什么?”这一简单的问题相信很多刚刚从Windows平台转到Mac平台的用户会问到的问题,因为Ma ...

  5. 牛客网 牛可乐发红包脱单ACM赛 A题 生成树

    [题解] 其实就是求两棵树不同的边有多少条.那么我们用一个set来去重即可. #include<cstdio> #include<cstring> #include<se ...

  6. 【HIHOCODER 1133】 二分·二分查找之k小数

    描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,000) ...

  7. POJ1450:Gridland 【杂题】

    题目大意:先给出了TSP的背景,然后给出一个n*m的单位格点的图,图中除边缘上的点与八个方向的点有边连接,距离为欧拉距离,求从左上角出发的TSP 思路:从水题列表中看到的题,但看一开始给出的backg ...

  8. asp.net 引发类型为“System.OutOfMemoryException”的异常

    asp.net 引发类型为“System.OutOfMemoryException”的异常通常发生在IIS进程获取不到内存时. 临时解决方法是: 回收IIS的应用程序池. 如果要比较好的解决办法是: ...

  9. 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。

    AndroidDevTools Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具.An ...

  10. 【POJ2774&Ural1517】Long Long Message(后缀数组)

    题意:求两个字符串的最长公共子串 n<=1000 思路:这是一道论文题 ..]of longint; n,l1,l2,i,ans,m,l,r:longint; ch:ansistring; pr ...