0
点赞
收藏
分享

微信扫一扫

手撸深入理解计算机系统系列-第二章

单调先生 2022-04-03 阅读 49
c语言

用#if、#elif、#endif编译的

函数定义在前半段

main函数的测试在后半段

有些有注释,有些无注释的,基本上难点的题都有注释,全部是自己想的(没有参考),这个过程的确比较痛苦,但提升也比较大。

^&^希望各位大神多多提出宝贵意见,轻喷

#include<stdio.h>
#include<math.h>
#include<stdint.h>
#include<limits.h>
#include<memory.h>
#include<crtdefs.h> 
typedef unsigned char byte_pointer;
typedef unsigned float_bits; 
#define  sz  (sizeof(int)<<3)
//-----------2_55---------------
void showbytes(byte_pointer* start,unsigned int n)
{
	int i;
	for(i=0;i<n;++i)
	{
		printf("%.2x ",start[i]);
	}
}
//-----------2_56/2_57---------------
void ShowLong(long x)
{
	showbytes((byte_pointer*)&x,sizeof(long));
}
void ShowShort(short x)
{
	showbytes((byte_pointer*)&x,sizeof(short));
}
void ShowDouble(double x)
{
	showbytes((byte_pointer*)&x,sizeof(double));
}
//--------------2_58----------------
int is_little_endian()
{
	int x=1;
	return *(char*)&x;
}
//--------------2_59----------------
unsigned out_put_change(unsigned x,unsigned y)
{
	return (x&0xff)|(y&~(0xff));
}
//--------------2_60----------------
unsigned replace_byte(unsigned x,unsigned n,unsigned b)
{
	return (x & (~(0xff<<n*8)))|(b<<n*8);
}
/*Get most significant byte from x*/
int get_msb(int x)//for type (int) w=4
{
	/* x by w-1 byte*/
	int shift=(sizeof(int)-1)<<3;
	/*shift*/
	int currentNum=x>>shift;
	/*get most significant byte*/
	return currentNum&0xff;
}
//--------------2_61----------------
use equial == or != 
//int allf(int x)//全是1 
//{
//	int w=sizeof(int)<<3;
//	int num=((1<<(w-1))-1)+(1<<(w-1));
//	return num==x;
//}
//int allzero(int x)//全是0
//{
//	return 0==x;
//}
//int lsb_allf(int x)//最低有效位全是1
//{
//	return (x&0xff)==0xff;
//}
//int msb_allf(int x)//最高有效位全是1
//{
//	int shift=(sizeof(int)-1)<<3;
//	int num=x>>shift;
//	return (num&0xff)==0xff;
//}


//-----------相等可以写成!(x^num)的形式 
int allf(int x)//全是1 
{
	int w=sizeof(int)<<3;
	int num=((1<<(w-1))-1)+(1<<(w-1));
	return !(x^num);//if x is all 1,x^0xffffffff is 0 
}
int allzero(int x)//全是0
{
	return !(x^0);//if x is all 0,x^0x00000000 is 0(x is all zero)
}
int lsb_allf(int x)//最低有效位全是1
{
	return !((x&0xff)^0xff);
	//if x'lsb is all 1,((x&0xff)^0xff) is 0(x is all zero)
}
int msb_allf(int x)//最高有效位全是1
{
	int shift=(sizeof(int)-1)<<3;
	int num=x>>shift;
	//x>>(32-8)
	return !((num&0xff)^0xff);
	//if x'lsb is all 1,((x&0xff)^0xff) is 0(x is all zero)
}
//--------------2_62----------------
int int_shift_are_arithemtic()
{
	int a=(-1>>1);
	return a&INT_MIN==INT_MIN;
}
//--------------2_63----------------
/*perform shift arithmetically*/
unsigned srl(unsigned x,int k)
{
	unsigned xsra=(int)x>>k;
	int w=sizeof(int)<<3;
	int mask=((1<<(k-1))-1)+(1<<(k-1));
	int shift=w-k;
	return ~(mask<<shift)&xsra;
}
/*perform shift logically*/
int sra(int x,int k)
{
	int xsrl=(unsigned)x>>k;
	int mask=((1<<(k-1))-1)+(1<<(k-1));
	int shift=sz-k;
	return (mask<<shift)|xsrl;
}
//--------------2_64----------------
int any_odd_one(unsigned x)
{
	return (x&0xAAAAAAAA)==0xAAAAAAAA;
}
//----------------2_65---------------
//共迭代五次 
//将区间分为两部分,前半部分和后半部分做异或,
//将相等的两部分置0,剩下的1都是单身,需要在下次操作中做判断 
int odd_ones(unsigned x)
{
	unsigned move1=x>>16;
	unsigned result1=move1^x;
	
	unsigned move2=result1>>8;
	unsigned result2=move2^result1;
	
	unsigned move3=result2>>4;
	unsigned result3=move3^result2;
	
	unsigned move4=result3>>2;
	unsigned result4=move4^result3;
	
	unsigned move5=result4>>1;
	unsigned result5=move5^result4;
	
	return result5&0x01;
} 
//----------------2_66---------------
//共迭代五次,将区间迭代复制给下个2^n个区间(n属于0~4)
//获得形如0..111111111...之类的数值
//返回((result5>>1)+1)&x
//将这个数字向右移动一位再加1(顺带考虑了0xffffffff的情况)
//&x考虑了x=0的情况 
int leftmost_one(unsigned x)
{	
	unsigned move1=x>>1;
	unsigned result1=x|move1;
	
	unsigned move2=result1>>2;
	unsigned result2=result1|move2;
	
	unsigned move3=result2>>4;
	unsigned result3=result2|move3;
	
	unsigned move4=result3>>8;
	unsigned result4=result3|move4;
	
	unsigned move5=result4>>16;
	unsigned result5=result4|move5;
	
	return  ((result5>>1)+1)&x;
} 
//----------------2_67---------------
int int_size_is_32_RunIn32()
{
	unsigned a=0xffffffff;
	return (a>>31); 
}
int int_size_is_32_RunIn16()
{
	unsigned a=0xffffffff;
	int b=a>>15;
	int c=b>>15;
	int d=c>>1;
	return d; 
}
//----------------2_68---------------
int lower_one_mask(int n)
{
	unsigned x=1<<(n-1);
	unsigned x2=(1<<(n-1))-1;
	return x+x2;
}
//----------------2_69---------------
unsigned rotate_left(unsigned x,int n)
{
	unsigned  right=x<<n;
	unsigned  left1 =x>>((32-n)-1);
	unsigned  left2 =left1>>1;
	return right+left2;
}
//----------------2_70----------------
//x可以被表示为n位2进制补码形式

//1.构造n位1进制数11111111111....为m
//2.m与x进行&操作
//若所得结果第n位为1 
//3.~m与x执行^操作
//所得结果为0

int fits_bits(int x,int n)
{
	unsigned m=((1<<(n-1))-1)+(1<<(n-1));
	unsigned result1=m&x;
	unsigned result2=~m&x;
	return !(result2)&&(result1>>(n-1));
} 
//----------------2_71----------------
typedef unsigned packed_t;
//受题干干扰——只能使用一个减号和左右移 
//写了半天(-@-) 
int xbyte(packed_t word,int bytenum)
{
	int b=(word<<((3-bytenum)<<3));
	return b>>(3<<3);
}
//----------------2_72----------------
//有符号数转化为无符号了


//----------------2_73----------------
//本题主要考察补码加法的溢出情况
//补码的溢出只发生在两正数相加或两负数相加
//正数溢出发生在到达INT_MAX
//负数溢出发生在到达INT_MIN
//结果是两正数相加得到一个负数,两负数相加得到一个正数 
int saturating_add(int x,int y)
{
	int sum=x+y;
	unsigned a=x&(1<<(sz-1));//a为0X00000000或者0X70000000; 
	unsigned b=y&(1<<(sz-1));//b为0X00000000或者0X70000000; 
	unsigned c=sum&(1<<(sz-1));//b为0X00000000或者0X70000000; 
	//溢出只发生在a为0X00000000,b为0X00000000,c为0X70000000;
	//或者是 a为0X70000000,b为0X70000000,c为0X00000000;
	int most_significant_bit=((~(a^b))&(1<<(sz-1)))&(a^c);
	//最关键的就是求most_significant_bit的值了
	//如果满足a^b为 0X00000000(x和y同号)
	//并且a^c为0X70000000(结果与其中之一的值不同号) 
	//u就被赋值为0X70000000;
	int mask=most_significant_bit>>(sz-1);
	//mask被赋值为int类型并执行算数右移
	//若满足溢出条件,mask为0XFFFF FFFF
	//不满足,mask为0X0000 0000 
	unsigned value=INT_MIN-(c>>(sz-1));
	//第二关键的步骤是求value
	//如果满足上式mask的条件
	//那么此时存在两种溢出条件
	//一是TMIN
	//二是TMAX
	
	//如果c是0X0000 0000,则是两负数相加溢出为正数 
	//如果c是0X7000 0000,则是两正数相加溢出为负数 
	return (~mask&sum)|(mask&value);
	//若mask为0X0000 0000,则返回值不影响sum值
	//若mask为0XFFFF FFFF,则返回值为对应c的(TMIN或者TMAX) 
}
//----------------2_74----------------
int tsub_ok(int x,int y)
//溢出方式与上述形式不一样
{
	unsigned a=(((unsigned)(-y))>>(sz-1))&&(y!=0x80000000);//主要这里的溢出条件改变了 
	unsigned b=((unsigned)x)>>(sz-1);
	unsigned c=((unsigned)(x-y))>>(sz-1);
	return !((!(a^b))&&(a^c));
}
//----------------2_75----------------用了乘法
//x和y都是w位数 
//基于x*y=(x_pre*2^(w/2)+x_post)*(x_pre*2^(w/2)+x_post)等价于 
/*
(x_pre*y_pre)*2^w                            //一 
+(x_pre*y_post+y_pre*x_post)*2^(w/2)         //二 
+(x_post*y_post)                             //三 
*/

//其中(x_pre*y_post+y_pre*x_post)*2^(w/2)等价于 
/*
	{(x_pre*y_post)_pre*2^(w/2)+(x_pre*y_post)_post+
	(y_pre*x_post)_pre*2^(w/2)+(y_pre*x_post)_post}*2^(w/2)
	=
	(x_pre*y_post)_pre*2^w+
	(y_pre*x_post)_pre*2^w+
	(x_pre*y_post)_post*2^(w/2)+
	(y_pre*x_post)_post*2^(w/2)
*/

//综上x*y=
/*
	(x_pre*y_pre)*2^w 
	(x_pre*y_post)_pre*2^w+
	(y_pre*x_post)_pre*2^w+  //可以证明以上不会溢出
	(x_pre*y_post)_post*2^(w/2)+
	(y_pre*x_post)_post*2^(w/2)+
	+(x_post*y_post)
	//这个过程可能会溢出两次
	//考虑0X0001FFFF和0X0001FFFF 相乘的情况
	//(x_pre*y_post)_post*2^(w/2)=0xFFFF0000
	//(y_pre*x_post)_post*2^(w/2)=0xFFFF0000
	//(x_post*y_post)=0xFFFE0001
	//------以上三个数相加必然会溢出两次
*/
unsigned unsigned_high_prod(unsigned x,unsigned y)
{
	unsigned w1pre=x>>(sz>>1);
	//x的前半部分(sz/2位 )(执行逻辑右移)
	unsigned w2pre=y>>(sz>>1);
	//y的前半部分(sz/2位 )(执行逻辑右移)
	unsigned w1post=x&(~((-1)<<(sz>>1)));
	//x的后半部分(sz/2位 ),(~((-1)<<(sz>>1)))实际上是0X0000FFFF 
	unsigned w2post=y&(~((-1)<<(sz>>1)));
	//y的后半部分(sz/2位 ),(~((-1)<<(sz>>1)))实际上是0X0000FFFF 
	printf("w1pre:%.4x\nw2pre:%.4x\nw1post:"
	"%.4x\nw2post:%.4x\n",w1pre,w2pre,w1post,w2post);
	//将以上四个部分的数输出 
	
	unsigned result2=w1post*w2pre;
	//x的后半部分和y的前半部分相乘得到一个sz位数 
	unsigned sub1_pre_forth=result2>>(sz>>1);
	//result2的前半部分
	unsigned sub1_post_forth=result2<<(sz>>1);
	//result2的后半部分
	
	unsigned result3=w2post*w1pre;
	//x的前半部分和y的后半部分相乘得到一个sz位数
	unsigned sub2_pre_forth=result3>>(sz>>1);
	//result3的前半部分
	unsigned sub2_post_forth=result3<<(sz>>1);
	//result3的后半部分
	 
	//-----------判断sub1_post_forth+sub2_post_forth是否溢出-------------
	unsigned sub12_post_forth_add=sub1_post_forth+sub2_post_forth;
	//判断两unsigned数相加(sub1_post_forth,sub2_post_forth)是否溢出
	unsigned a1=((unsigned)sub1_post_forth)>>(sz-1);
	//sub1_post_forth的msb 
	unsigned b1=((unsigned)sub2_post_forth)>>(sz-1);
	//sub2_post_forth的msb 
	unsigned c1=((unsigned)(sub12_post_forth_add))>>(sz-1);
	 //sub12_post_forth_add的msb 
	unsigned u1=(a1&b1)|(((a1^b1)^c1)&(a1|b1)); //1 0 0;0 1 0;1 1;
	//case1:判断条件是(a1,b1)都为1,则溢出
	//case2:若(a1,b1)有一个为1,c1却为0,则溢出 
	
	//-----------判断result4+sub12_post_forth_add是否溢出-------------
	unsigned result4=w1post*w2post;
	//x的后半部分和y的后半部分相乘得到一个sz位数(必为正数,赋值为unsigned)
	unsigned add_sub12_post_add_result4=sub12_post_forth_add+result4;
	//判断两unsigned数相加(sub12_post_forth_add,result4)是否溢出
	unsigned a2=((unsigned)sub12_post_forth_add)>>(sz-1);
	//sub12_post_forth_add的msb 
	unsigned b2=((unsigned)result4)>>(sz-1);
	//result4的msb
	unsigned c2=((unsigned)(add_sub12_post_add_result4))>>(sz-1);
	//add_sub12_post_add_result4的msb
	unsigned u2=(a2&b2)|(((a2^b2)^c2)&(a2|b2));//1 0 0;0 1 0;1 1;
	//case1:判断条件是(a2,b2)都为1,则溢出
	//case2:若(a2,b2)有一个为1,c1却为0,则溢出
	
	
	int result1=w1pre*w2pre;
	//result1:x的前半部分和y的前半部分相乘得到一个sz位数
	int result=result1+sub1_pre_forth+sub2_pre_forth+u1+u2;//加上溢出的数 
	return result;
}

int signed_high_prod(int x,int y)
{
	int w1pre=x>>(sz>>1);//x的前半部分(sz/2位 )
	//(有可能为负数)(负数执行算数右移,正数执行逻辑右移)
	int w2pre=y>>(sz>>1);//y的前半部分(sz/2位 )(有可能为负数)
	//(负数执行算数右移,正数执行逻辑右移) 
	int w1post=x&(~((-1)<<(sz>>1)));//x的后半部分(sz/2位 )(必为正数)
	int w2post=y&(~((-1)<<(sz>>1)));//y的后半部分(sz/2位 )(必为正数)
	printf("\nw1pre:%.4x\nw2pre:%.4x\nw1post:"
	"%.4x\nw2post:%.4x\n",w1pre,w2pre,w1post,w2post);
	//将以上四个部分的数输出 
	
	int result2=w1post*w2pre;
	//x的后半部分和y的前半部分相乘得到一个sz位数 (有可能为负数,赋值为int)
	int sub1_pre_forth=result2>>(sz>>1);
	//result2的前半部分(有可能为负数,赋值为int)
	unsigned sub1_post_forth=result2<<(sz>>1);
	//result2的后半部分(必为正数,赋值为unsigned)
	
	int result3=w2post*w1pre;
	//x的前半部分和y的后半部分相乘得到一个sz位数(有可能为负数,赋值为int)
	int sub2_pre_forth=result3>>(sz>>1);
	//result3的前半部分(有可能为负数,赋值为int)
	unsigned sub2_post_forth=result3<<(sz>>1);
	//result3的后半部分(必为正数,赋值为unsigned)
	 
	//-----------判断sub12_post_forth_add是否溢出-------------
	unsigned sub12_post_forth_add=sub1_post_forth+sub2_post_forth;
	//判断两unsigned数相加(sub1_post_forth,sub2_post_forth)是否溢出
	unsigned a1=((unsigned)sub1_post_forth)>>(sz-1);
	//sub1_post_forth的msb 
	unsigned b1=((unsigned)sub2_post_forth)>>(sz-1);
	//sub2_post_forth的msb 
	unsigned c1=((unsigned)(sub12_post_forth_add))>>(sz-1);
	 //sub12_post_forth_add的msb 
	unsigned u1=(a1&b1)|(((a1^b1)^c1)&(a1|b1)); //1 0 0;0 1 0;1 1;
	//case1:判断条件是(a1,b1)都为1,则溢出
	//case2:若(a1,b1)有一个为1,c1却为0,则溢出 
	
	//-----------判断result4是否溢出-------------
	unsigned result4=w1post*w2post;
	//x的后半部分和y的后半部分相乘得到一个sz位数(必为正数,赋值为unsigned)
	unsigned add_sub12_post_add_result4=sub12_post_forth_add+result4;
	//判断两unsigned数相加(sub12_post_forth_add,result4)是否溢出
	unsigned a2=((unsigned)sub12_post_forth_add)>>(sz-1);
	//sub12_post_forth_add的msb 
	unsigned b2=((unsigned)result4)>>(sz-1);
	//result4的msb
	unsigned c2=((unsigned)(add_sub12_post_add_result4))>>(sz-1);
	//add_sub12_post_add_result4的msb
	unsigned u2=(a2&b2)|(((a2^b2)^c2)&(a2|b2));//1 0 0;0 1 0;1 1;
	//case1:判断条件是(a2,b2)都为1,则溢出
	//case2:若(a2,b2)有一个为1,c1却为0,则溢出
	
	
	int result1=w1pre*w2pre;
	//result1:x的前半部分和y的前半部分相乘得到一个sz位数(有可能为负数)
	int result=result1+sub1_pre_forth+sub2_pre_forth+u1+u2;//加上溢出的数 
	return result;
}
//----------------2_76----------------用了乘法和除法 
/*
void* calloc(size_t nmemb,size_t size)
{
	int bytes_size=sizeof(size_t)<<3;
	size_t num=nmemb*size;
	size_t result=!num|(num/nmemb==size);
	size_t mask=~(result-1);
	size_t real_num=mask&num;
	void *p;
	if(real_num==0)
	{
		return NULL;
	}
	p = malloc(real_num);
	p=memset(p,0,real_num);
	while(real_num)
	{
		printf("%.2x ",*(char*)p++);
		--real_num;
	}
	printf("%d ",real_num);
	return p;
}
*/
//---------------------2_77------------------
int mul_17(int x)
{
	return (x<<4)+x;
}
int mul_sub7(int x)
{
	return x-(x<<3);
}
int mul_60(int x)
{
	return (x<<6)-(x<<2);
}
int mul_sub112(int x)
{
	return (x<<4)-(x<<7);
}
//----------------2_78----------------
int divide_power2(int x,int k)
{
	int signal1=(x>>(sz-1))&((1<<k)-1);
	return (x+signal1)>>k;
}
//----------------2_79----------------
int divide_mul_3divide_4(int x)//x*3/4(额外实现向零舍入,但是它会溢出)
{
	int signal1=(x>>(sz-1))&((1<<2)-1);
	return (((x<<1)+x)+signal1)>>2;
}
//----------------2_80----------------
int threefourths(int x)//x*3/4(实现向零舍入,不会溢出)
{
	int signal1=(x>>(sz-1))&((1<<2)-1);
	int signal2=(x&0x3)+((x<<1)&0x2)+signal1;
	return (x>>1)+(x>>2)+((signal2&0xc)>>2);
}
//----------------2_81----------------
unsigned bit_mode1(int k)
{
	unsigned u=(1<<k)-1;
	return ~u;
}
unsigned bit_mode2(int k,int j)
{
	unsigned u1=(1<<k<<j)-1;
	unsigned u2=(1<<j)-1;
	return u1-u2;
}
//----------------2_82----------------
//经验证第一个为假,取INT_MIN不为真 
//---------------2_90----------------------
float u2f(unsigned u)
{
	return *(float*)(&u);
}
unsigned f2u(float f)
{
	return *(unsigned*)(&f);
}
float fpwr2(int x)
{
	unsigned exp,frac;
	unsigned u;
	
	if(x<-149)
	{
		exp=0;
		frac=0;
	}
	else if(x<-126)
	{
		exp=0;
		frac=1<<(x+149);
	}
	else if(x<128)
	{
		exp=x+127;
		frac=0;
	}
	else
	{
		exp=127;
		frac=0;
	}
	u=exp<<23|frac;
	return u2f(u);
}
void showbyte_by_big_endian(byte_pointer *start,int n)
{
	unsigned i;
	for(i=n;i>=0;--i)
	{
		printf("%.2x ",start[i-1]);
	}
}
//---------------2_91----------------------
//一、3.141592741012573242
//二、22/7=11.[001] 
//三、22/7和223/71从第9位开始 
//---------------2_92----------------------

float_bits float_negate(float_bits f)
{
	float_bits sign=(0x01<<(sz-1));
	float_bits exp=0xff<<23;
	float_bits frac=(0x7fffff)&f;
	if(((exp&f)==exp)&&frac)
		return f; 
	f=f^sign;
	return f;
}
//---------------2_93----------------------
float_bits float_absval(float_bits f)
{
	float_bits sign=~(0x01<<(sz-1));
	float_bits exp=0xff<<23;
	float_bits frac=(0x7fffff)&f;
	if((exp&f==exp)&&frac)
		return f; 
	f=f&sign;
	return f;
}
//---------------2_94----------------------
float_bits float_twice(float_bits f)
{
	float_bits exp=0xff<<23;
	float_bits frac=(0x7fffff)&f;
	float_bits ture_exp=(((exp&f)>>23)+1)<<23;
	if((exp&f==exp)&&frac)
		return f;
	f=((f&~(0xff<<23))|(ture_exp));
	return f;
}
//---------------2_95----------------------
float_bits float_half(float_bits f)
{
	float_bits exp=0xff<<23;
	float_bits frac=(0x7fffff)&f;
	float_bits ture_exp=(((exp&f)>>23)-1)<<23;
	if((exp&f==exp)&&frac)
		return f;
	f=((f&~(0xff<<23))|(ture_exp));
	return f;
}
//---------------2_96-----------------
//该函数未实现向零舍入和对NaN的判断 
int float_f2i(float_bits f)
{
	int sign=(0x01<<(sz-1))&f;
	unsigned frac=f&0x7fffff;
	unsigned exp=0xff<<23;
	unsigned true_exp=((exp&f)>>23)-127;
	int result;
//	printf("%.2x\n",frac|(0x01<<23));
//	printf("%.2x\n",true_exp);
	if(true_exp>23)
		result = (frac|(0x01<<23))<<(true_exp-23);
	else
		result = (frac|(0x01<<23))>>(23-true_exp);
	return (result^(sign>>(sz-1)))+(((unsigned)sign)>>(sz-1));
}
//---------------2_97-----------------

int useful_bits(unsigned x)
{	
	unsigned move1=x>>1;
	unsigned result1=x|move1;
	
	unsigned move2=result1>>2;
	unsigned result2=result1|move2;
	
	unsigned move3=result2>>4;
	unsigned result3=result2|move3;
	
	unsigned move4=result3>>8;
	unsigned result4=result3|move4;
	
	unsigned move5=result4>>16;
	unsigned result5=result4|move5;
	
	return  result5;
} 
int num_of_bits(unsigned usefulbits)
{
	unsigned nums=usefulbits-(usefulbits>>1)-(usefulbits>>2)-(usefulbits>>3)-
	(usefulbits>>4)-(usefulbits>>5)-(usefulbits>>6)-(usefulbits>>7)-
	(usefulbits>>8)-(usefulbits>>9)-(usefulbits>>10)-(usefulbits>>11)-
	(usefulbits>>12)-(usefulbits>>13)-(usefulbits>>14)-(usefulbits>>15)-
	(usefulbits>>16)-(usefulbits>>17)-(usefulbits>>18)-(usefulbits>>19)-
	(usefulbits>>20)-(usefulbits>>21)-(usefulbits>>22)-(usefulbits>>23)-
	(usefulbits>>24)-(usefulbits>>25)-(usefulbits>>26)-(usefulbits>>27)-
	(usefulbits>>28)-(usefulbits>>29)-(usefulbits>>30)-(usefulbits>>31);
	return nums;
}
float_bits float_i2f(int i)
{
	int sign=(0x01<<(sz-1))&i;
	//最高符号位 
	unsigned abs_i=(i^(sign>>(sz-1)))+(((unsigned)sign)>>(sz-1));
	//取i的绝对值 
	unsigned usefulbits=useful_bits(abs_i);
	//将abs_i的有效位全置为1 
	unsigned leftmostbits=((usefulbits>>1)+1)&abs_i;
	//求abs_i的最高有效位的表示 
	unsigned value=num_of_bits(usefulbits^leftmostbits);
	//求abs_i去除最高有效位后还剩下有效位的个数 
	int drop_leftmost=leftmostbits^abs_i;
	//去除abs_i的最高有效位
	float_bits frac=drop_leftmost;
	//frac等于去除最高有效位后的位表示 
	float_bits exp=(value+127)<<23;
	//求float中的指数部分的表示 
	if(value>23)
		frac = frac>>(value-23);
	else
		frac = frac<<(23-value);
	return sign|exp|frac;
}

//------------------main()------------ 
int main()
{
#if 1
//---------------2_97-----------------
int i=-26556;
float f=i;
float_bits fb=f2u(f);
printf("fb:%.2x\n",fb);
printf("i2f:%.2x\n",float_i2f(i));
#elif 0
//---------------2_96-----------------
int i=0;
float f=i;
float_bits fb=f2u(f);
printf("i:%d\n",i);
printf("f:%d\n",f);
printf("f2i:%d\n",float_f2i(fb));
#elif 0
//---------------2_95----------------------
float f1=-60;
float f2=-120;
float_bits fb1=f2u(f1);
float_bits fb2=f2u(f2);
printf("%.2x\n",fb1);
printf("%.2x\n",float_half(fb2));
#elif 0
//---------------2_94----------------------
float f1=-120;
float f2=-60;
float_bits fb1=f2u(f1);
float_bits fb2=f2u(f2);
printf("%.2x\n",fb1);
printf("%.2x\n",float_twice(fb2));
#elif 0
//---------------2_93----------------------
float f=-1e1000;
float_bits fb=f2u(f);
printf("%.2x\n",fb);
printf("%.2x\n",float_absval(fb));
#elif 0
//---------------2_92----------------------
float f=0;

float_bits fb1=f2u(f);
float_bits fb2=0x7f800001;
printf("%.2x\n",fb1);
printf("%.2x\n",float_negate(fb1));
printf("%.2x\n",fb2);
printf("%.2x\n",float_negate(fb2));

#elif 0
//---------------2_90----------------------
	float p=fpwr2(-149);
	showbyte_by_big_endian((byte_pointer*)&p,sizeof(float));
#elif 0
//----------------2_82----------------
int x=0x80000000;
int y=0x60000000;
unsigned ux=(unsigned)x;
unsigned uy=(unsigned)y;
printf("%.2x\n",ux-uy);
printf("%.2x\n",-(unsigned)(y-x));
#elif 0
//----------------2_81----------------
printf("%.16llx\n",bit_mode1(30));
printf("%.16llx\n",bit_mode2(5,8));
#elif 0
//----------------2_80----------------
printf("%d\n", threefourths(0x80000000));
#elif 0
//----------------2_79----------------
printf("%d\n", divide_mul_3divide_4(0x80000000));
#elif 0
//----------------2_78----------------
printf("%d\n", divide_power2(-5,3));


#elif 0
//----------------2_77----------------
printf("%d\n",mul_17(2));
#elif 0
//----------------2_76----------------
calloc(0xff,0xff);

#elif 0
//----------------2_75----------------
printf("%.8x\n%.8x\n\n",unsigned_high_prod(0xE396667C,0xE6E1B7C6),0xE396667C*0xE6E1B7C6);
printf("%.8x\n%.8x\n\n",unsigned_high_prod(0x1FFFF,0x1FFFF),0x1FFFF*0x1FFFF);
printf("%.2x\n",signed_high_prod(INT_MIN,INT_MIN));
#elif 0
//----------------2_74----------------
printf("%d",tsub_ok(0xffffffff,0xffffffff));
#elif 0
//----------------2_73----------------
	printf("%d",saturating_add(INT_MIN,INT_MAX));
#elif 0
//----------------2_72----------------
//有符号数转化为无符号了
//----------------2_71----------------
	printf("%x\n",xbyte(0x4fffffff,3));
#elif 0
//----------------2_70----------------
#elif 0
//----------------2_69---------------
	printf("%x\n",rotate_left(0x12345678,0));
	printf("%x\n",rotate_left(0x12345678,4));
	printf("%x\n",rotate_left(0x12345678,20));
#elif 0
//----------------2_68---------------
	printf("%x\n",lower_one_mask(17));
#elif 0
//----------------2_67---------------
	printf("%x\n",int_size_is_32_RunIn32());

#elif 0
//----------------2_66---------------
	printf("%x\n",leftmost_one(0x6600));

#elif 0
//--------------2_65----------------
	printf("%x\n",odd_ones(0xfffffff8));
#elif 0
//--------------2_64----------------
	printf("%x\n",any_odd_one(0xffffffff));
#elif 0
//--------------2_63----------------
	printf("%.2x\n",srl(0xffffffff,16));//算术右移转化为逻辑右移 
	printf("%.2x\n",sra(0xffffffff,16));//逻辑右移转化为算数右移 
	
	
#elif 0
//--------------2_62----------------
	printf("%d\n",int_shift_are_arithemtic());

#elif 0
//--------------2_61	----------------
	printf("%d\n",allf(0xffffffff));//allf
	printf("%d\n",allzero(0x00000000));//allzero
	printf("%d\n",lsb_allf(0xff));//Least significant byte is all 1
	printf("%d\n",msb_allf(0xff110a00));//most significant byte is all 1

#elif 0
//--------------2_60----------------
	unsigned x=0x12345678;
	unsigned n=0;
	unsigned b=0xAB;
	printf("%.2x",replace_byte(x,1,b));
	
#elif 0
	//--------------2_59----------------
	unsigned x=0x89ABCDEF;
	unsigned y=0x76543210;
	printf("%.2x",out_put_change(x,y));
#elif 0
	//--------------2_58----------------
	printf("%d",is_little_endian());
#elif 0
	//-----------2_56/2_57---------------
	int x=0xfff;
	long x2=0xfff;
	long x3=0xfff;
	double x4=1.342;
	showbytes((byte_pointer*)&x,sizeof(int));
	printf("\n");
	ShowLong(x2);
	printf("\n");
	ShowShort(x3);
	printf("\n");
	ShowDouble(x4);	
#endif
} 
举报

相关推荐

0 条评论