计算机系统基础:数据操纵实验

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);
  }
}

在这里插入图片描述

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值