bic和bis实现或、与、取反、异或

阅读: 评论:0

bic和bis实现或、与、取反、异或

bic和bis实现或、与、取反、异或

练习题2.13: 从20世纪70年代末到80年代末,Digital Equipment的VAX计算机是一种非常流行的机型。它没有布尔运算AND和OR指令,只有bis(位设置)和bic(位清除)这两种指令。只有bis(位设置)和bic(位清除)这两种指令。两种指令的输入都是一个数据字x和一个掩码字m。它们生成一个结果z,z是由根据掩码m的位来修改x的位来得到的。使用bis指令,这种修改就是在m为1的每个位置上,将z对应的位设置为1.使用bic指令,这种修改是在m为1的每个位置上,将z对应的位设置为0.
假设我们有两个函数:bis和bic来实现位设置和位清除操作,用这两个函数,不使用任何其他C语言运算,实现C语言的位级运算,写出bis和bic运算的C语言表达式。

/*Declarations of functions implementing operations bis and bic*/
int bis(int x,int y);
int bic(int x,int y);/*
Compute x|y using only calls to functions bis and bic*/
int bool_or(int x,int y)
{int result=_________;return result;
}/*Compute x^y using only calls to functions bis and bic*/
int bool_xor(int x,int y)
{int result=_________;return result;
}/*Compute x&y using only calls to functions bis and bic*/
int bool_and(int x,int y)
{int result=_________;return result;
}/*Compute x&y using only calls to functions bis and bic*/
int bool_not(int x,int y)
{int result=__________;return result;
}

分析:

1.对bis和bic进行分析:
bis指令:在m为1的每个位置上,将z对应的位设置为1.
bic指令,在m为1的每个位置上,将z对应的位设置为0.
bis(0,0)=0
bis(0,1)=1
bis(1,0)=1
bis(1,1)=1
由此可看出:bis指令的作用相当于|位运算
所以在求x|y是,可以填写bis(x,y),完整的程序是:

/*Declarations of functions implementing operations bis and bic*/
int bool_or(int x,int y)
{int result=bis(x,y);return result;
}

bic(0,0)=0
bic(0,1)=0
bic(1,0)=1
bic(1,1)=0
由于bic不属于任何位运算级实现,所以可将bis和bic联合起来进行使用。

2.将bis和bic联合起来进行分析:bis(bic(x,y),bic(y,x))
bis(bis(0,0),bic(0,0))=0
bis(bic(0,1),bic(1,0))=1
bis(bic(1,0),bic(0,1))=1
bis(bic(1,1),bic(1,1))=0
由此可见,当x与y相异时,得到的值为1,相同时得到的值为0,符合位运算中异或的运算规则,所以可以得到完整代码为:

/*Compute x^y using only calls to functions bis and bic*/
int bool_xor(int x,int y)
{int result=bis(bic(x,y),bic(y,x));return result;
}

3.将bis和bic联合起来,并加入掩码进行运算,完整的代码为:

/*Compute x&y using only calls to functions bis and bic*/
int bool_and(int x,int y)
{int result=bic(0xFFFF,bis(bic(0xFFFF,x),bic(0xFFFF, y));return result;
}

掩码应用举例:
1.x=0x87654321,在32位的机器上,保留x的最低有效字节,其他位都置为0。
C语言表达式:x&=0xFF -> x=0x00000021

2.x=0x87654321,在32位的机器上,除了x的最低有效位外,其他的位都取补,最低有效字节保持不变。
C语言表达式:x^=0xFFFFF00 -> x=0x789ABC21

小技巧:
1.0^任何数=任何数
2.a^a=0
3.(a^ b)^a=b
4. 0xFFFFFFFF ^ 任何数 = ~ 任何数

4.将掩码进行运算和bic联合起来,完整的代码为:

/*Compute x&y using only calls to functions bis and bic*/
int bool_not(int x)
{int result=bic(0xFFFFFFFF,x);return result;
}

本文发布于:2024-02-04 23:09:20,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170718504860618.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:bic   bis
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23