计组实验datalabhandout实验报告材料Word下载.docx
- 文档编号:13570064
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:8
- 大小:20.05KB
计组实验datalabhandout实验报告材料Word下载.docx
《计组实验datalabhandout实验报告材料Word下载.docx》由会员分享,可在线阅读,更多相关《计组实验datalabhandout实验报告材料Word下载.docx(8页珍藏版)》请在冰豆网上搜索。
3即为n*8位。
x>
3)即为x只保留下除去最后n*8位剩下的部分。
再&
255则只保留剩下的最右一个字节。
得出的结果便为编号指定要提取的那个字节。
intlogicalShift(intx,intn){
intmask=~(((1<
31)>
n)<
1);
returnmask&
(x>
n);
~(((1<
1)即为232-n-1,也就是mask=(000⋯011111⋯1)(2n个0,31-n个1)。
再mask&
n)即为将x算术右移n位后并上mask这个前n位为0的掩码,使当x为负数时位移补1换为补0。
intbitCount(intx){
intresult;
inttmp_mask1=(0x55)|(0x55<
8);
intmask1=(tmp_mask1)|(tmp_mask1<
16);
inttmp_mask2=(0x33)|(0x33<
intmask2=(tmp_mask2)|(tmp_mask2<
inttmp_mask3=(0x0f)|(0x0f<
intmask3=(tmpmask3)|(tmpmask3<
intmask4=(0xff)|(0xff<
intmask5=(0xff)|(0xff<
result=(x&
mask1)+((x>
1)&
mask1);
result=(result&
mask2)+((result>
2)&
mask2);
result=(result+(result>
4))&
mask3;
8))&
mask4;
16))&
mask5;
returnresult;
本题采用二分法,先计算x每两位中1的个数,并用对应的两位来储存这个个数。
然后计算每四位1的个数,再用对应的四位进行储存。
依次类推,最后整合得到16位中1的个数,即为x中1的个数并输出。
intbang(intx){
return(~((x|(~x+1))>
31))&
1;
(x|(~x+1)即当x为0时,结果为(00⋯0)2(31个0)。
其余情况最首位均为1。
因此右移31位后再取反只有x=0时最后一位为1。
再&
1取最后一位。
因此当x=0时得到1,其余情况得到0。
inttmin(void){
return1<
31;
1<
31即(100⋯0)2(31个0)。
其中1是符号位。
即为负零,以表示最小的整数。
intfitsBits(intx,intn){
intshiftNumber=~n+33;
return!
(x^((x<
shiftNumber)>
shiftNumber));
shiftNumber=~n+33即为-1-n+33=32-n,((x<
shiftNumber)即先左移32-n位,再右移32-n位,即保留最后n位数。
在与x按位异或并逻辑取反,若两者两同即x可被表示为一个n位整数,结果为!
0,即返回为1。
两者不同则不可表示为n位整数,结果为!
(一个非零数),返回0。
intdivpwr2(intx,intn){
intsignx=x>
intmask=(1<
n)+(~0);
intbias=signx&
mask;
return(x+bias)>
n;
signx=x>
31为取x的符号位,mask=(1<
n)+(~0)即mask等于2n-1,bias=signx&
mask即当x为正数,signx=0,bias为0,x为负数,signx=11111111111111,bias=mask。
(x+bias)>
n当x为正数即x>
n,得到结果符合要求。
当x为负数时,需要加上偏置量2n-1得到预期结果,因此加上signx,得到结果符合要求。
intnegate(intx){
return~x+1;
~x+1即-1-x+1=-x。
得到结果正确。
intisPositive(intx){
((x>
31)|(!
x));
//return~(x>
31)&
!
x
31)即取x的符号位,!
x为逻辑取反,当x=0时!
x=1,其他情况均为0.(x>
x)即当x=0时得到1,x为负数得到1,x为正数得到0。
再进行逻辑取反,即当x为正数时返回1,x为0或负数时返回0。
intisLessOrEqual(intx,inty){
//判断符号
intsigny=y>
intsignSame=((x+(~y))>
(signx^signy));
//判断是否小于等于
intsignDiffer=signx&
(!
signy);
returnsignDiffer|signSame;
intsx=!
31);
intsy=!
(y>
intz=y+(~x+1);
//y-x
ints=!
(z>
return(!
(sx^sy)&
s)|((sx^sy)&
sx);
/*intdifference=(~x+1)+y;
/*y-x*/
return((x&
~y)|(x&
~difference)|(~y&
~difference))>
31&
0x1;
/*通过x,y,
difference的卡诺图求解*/
*/
补码=反码+1
前两步取x、y的符号位,第三步中(x+(~y))>
31为当x-y-1为负数时取1,!
(signx^signy)为两者相同时取1,两者相或即x<
=y时signSame为1,第四步即当x<
0,y>
0时signDiffer为1。
最后一步即当x<
0时必返回1,其余情况则x<
=y返回1。
效果即为如果x<
=y,则返回1,否则返回0。
intilog2(intx){
intbitsNumber=0;
bitsNumber=(!
16))<
4;
bitsNumber=bitsNumber+((!
(bitsNumber+8)))<
3);
(bitsNumber+4)))<
2);
(bitsNumber+2)))<
bitsNumber=bitsNumber+(!
(bitsNumbel47r+1)));
bitsNumber)+(~0)+(!
(1^x));
returnbitsNumber;
/*intilog2(intx){
x=x>
/*通过计算把1右移到的次数来实现ilog2的函数*/
x=x|x>
2;
8;
16;
/*利用或和右移,把1后的所有0变为1*/
intcount=0;
intn=0x1|0x1<
8|0x1<
16|0X1<
24;
count+=x&
count+=x>
1&
2&
3&
4&
5&
6&
7&
return(count&
0xf)+(count>
8&
16&
24&
0xf);
/*即BitCount函数*/
本题与bitcout的方法相似,也为二分法。
4即x向右移16位后若若大于0即得到(10000)2=16,否则得到0。
这是判断最高位是否不为0,若不为0则包含2的16次方。
即得到最高位的log数。
同理bitsNumber=bitsNumber+((!
(bitsNumber+1)));
为判断从高到底各位的log情况,这个方法将每位分开求log并相加。
这一句是当x为零时,还需要减去1才能得到正确的数值。
unsignedfloat_neg(unsigneduf){unsignedresult;
unsignedtmp;
tmp=uf&
(0x7fffffff);
result=uf^0x80000000;
if(tmp>
0x7f800000)
result=uf;
(0x7fffffff)
为将uf的符号位改为0。
result=uf^0x80000000
即当uf不是NAN,通过加0x80000000来改变符号位。
0x7f800000即无穷大,如果tmp的值比无穷大还大,那就是NAN,则返回uf
unsignedfloat_i2f(intx){
unsignedshiftLeft=0;
unsignedafterShift,tmp,flag;
//定义尾数,进位数
:
0=6e|j
esp
(ooeoxo==(weoxo$*us」印捋))上夬©
L=6e|j
(OOLOXOvQ打Oxo$#!
US」巩捋))j!
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 datalabhandout 报告 材料