Lab1 数据操纵实验
lsbZero:
int lsbZero(int x) {
x=x>>1;
x=x<<1;//x右移一位再左移一位实现把最低有效位置0
return x;
}
byteXor:
bint byteXor(int x, int y, int n) {
//把x和y的第n的个字节取出来异或,再转换为逻辑的0和1
n=n<<3;
x=x>>n;
y=y>>n;
x=x&(0xff);
y=y&(0xff);
return !!(xy);
}
logicalAnd:
int logicalAnd(int x, int y) {
x=(!(!x))&(!(!y));//把x和y分别转化为逻辑的0和1,再相与
return x;
}
logicalOr:
int logicalOr(int x, int y) {
x=(!(!x))|(!(!y));//把x和y分别转化为逻辑的0和1,再相或
return x;
}
rotateLeft:
int rotateLeft(int x, int n) {
//先构造低n位为1且高32-n位为0的数z,x左移n位后的数加上x右移32-n位的数&z
int z;
z=~(((131)<<n);
x=((x>>(32+(~n+1)))&z)+(x<<n);
return x;
}
howmanybits:
int howManyBits(int x) {
//根据二分法计算一个数的补码需要多少位
int y=x(x>>31);
int m=!y;
int n=(!(!y)31;
int bit16=!(!(y>>16))<<4;
y=y>>bit16;
int bit8=!(!(y>>8))<<3;
y=y>>bit8;
int bit4=!(!(y>>4))<<2;
y=y>>bit4;
int bit2=!(!(y>>2))<<1;
y=y>>bit2;
int bit1=!(!(y>>1));
y=bit16+bit8+bit4+bit2+bit1+2;
return m|(y&n);
}
ilog2:
int ilog2(int x) {
//求x最高位的1的索引,若x高16位有1,则至少有16位
int y=0;
y=(!!(x>>16))<<4;
y+=(!!(x>>(y+8)))<<3;
y+=(!!(x>>(y+4)))<<2;
y+=(!!(x>>(y+2)))<<1;
y+=(!!(x>>(y+1)));
return y;
}
parityCheck:
int parityCheck(int x) {
//将数的低半数位与高半数位比较,最后将y右移31,再把y转换为逻辑的0和1
int y;
y=x<<16;
y=yx;
y=y(y<<8);
y=y(y<<4);
y=y(y<<2);
y=y(y<<1);
y=y>>31;
return !(!y);
}
mul2OK:
int mul2OK(int x) {
int y;
y=((x>>31)&0x1)((x>>30)&0x1);
//把x第31位与1做按位与,第30位也和1做按位与,两者异或,再和1异或
return y0x1;
}
mult3div2:
int mult3div2(int x) {
int y=(x<<1)+x;//左移1位再+x=x×3
y=(y>>1)+(((y>>31)&1)&(((y31)&1));//右移1位时,当x的最高位和最低位都为0时还需再加1
return y;
}
subOK
int subOK(int x, int y) {
//判断x-y结果是否溢出(当x的最高有效位和y的最高有效位不同且x和x-y的最高位不同判断溢出)
int m=(x>>31)&1;
int n=(y>>31)&1;
x=(mn)&(m^(((x+(~y+1))>>31)&1));
return (!x);
}
absVal(求x的绝对值):
int absVal(int x) {
//x最高位为0时就是x,最高位为1时是~x+1
int y=x>>31;
x=(y&(~x+1))+((~y)&x);
return x;
}
floatabs
unsigned floatabs(unsigned uf) {
//返回浮点数绝对值的二进制表示
int x=uf&(~(1<<31));
if(x>0x7f800000)
{
return uf;
}
else return x;
}
floatf2i
int floatf2i(unsigned uf) {
//返回(int)f的二进制
unsigned num=0x80000000;
int x=(uf&0x007fffff)0x00800000;
int order=0;
order=(uf&0x7f800000)>>23;
if(order>158){
return num;
}
if(order<127) return 0;
else if(((uf>>31)&1)==1){
if(order>150){
return ~(x<<(order-150))+1;
}
else return ~(x>>(150-order))+1;
}
else{
if(order>150) return x<<(order-150);
else return x>>(150-order);
}
}