C位逻辑运算难题

C位逻辑运算难题,c,operators,bits,C,Operators,Bits,所以我需要写一个方法来解决这个难题: 浮动f2i 返回浮点参数f的表达式(int)f的位级等效值 参数作为无符号int传递,但它将被解释为位级别 表示单精度浮点值 超出范围的任何内容(包括NaN和无穷大)都应返回0x80000000u 所以我从中得到的是,给我一个十六进制的数字,我必须编写代码,将其转换成整数格式。给出了一个测试用例; 参数[0x00800000],返回[0x0]因为0x00800000是1.1754…E-38,小到可以返回为零(我假设) 到目前为止,我得到的是: int f

所以我需要写一个方法来解决这个难题:

浮动f2i

  • 返回浮点参数f的表达式(int)f的位级等效值

  • 参数作为无符号int传递,但它将被解释为位级别 表示单精度浮点值

  • 超出范围的任何内容(包括NaN和无穷大)都应返回0x80000000u

所以我从中得到的是,给我一个十六进制的数字,我必须编写代码,将其转换成整数格式。给出了一个测试用例;
参数[0x00800000],返回[0x0]
因为0x00800000是1.1754…E-38,小到可以返回为零(我假设)

到目前为止,我得到的是:

int float_f2i(unsigned uf) {
  unsigned sign = uf & (0x80000000);
  unsigned exp  = uf >> 23 & 0xff;
  unsigned frac = uf & 0x7fffff;

  //takes care of NaN and inifinity
  if (exp == 255) {return 0x80000000u;}


  if ((exp > 0) && (exp < 255)) //normalized
  {
    if ((sign >> 28) == 0x0) //if sign bit is 0
    {
      return (0x1); //NEEDS MORE HERE
    }
    else if ((sign >> 28) == 0x8) //if sign bit is 1
    {
      return (0x8); //NEEDS MORE HERE
    }
  }
  else if (exp == 0)//denormalized
  {
    return 0; // rounds to zero anyway
  }
}
int float_f2i(无符号uf){
无符号符号=uf&(0x8000000);
无符号exp=uf>>23&0xff;
无符号分形=uf&0x7fffff;
//照顾NaN和inifinity
如果(exp==255){返回0x80000000u;}
if((exp>0)&&(exp<255))//标准化
{
if((符号>>28)=0x0)//如果符号位为0
{
return(0x1);//此处需要更多信息
}
else if((符号>>28)==0x8)//如果符号位为1
{
return(0x8);//此处需要更多信息
}
}
else if(exp==0)//非规范化
{
返回0;//仍将舍入为零
}
}
我知道要使其工作,我必须将指数部分添加到返回语句中(1.frac^(exp-127)),但我不知道如何将其编码。向左移动乘以2,但是对于负指数2,我需要向右移动,但是>>操作符在算术上这样做。我需要创建一个动态掩码来消除算术移位产生的1位吗

编辑:得到了一个答案,我完全走错了方向,如果有人必须这样做,未来的参考:

int float_f2i(unsigned uf) {
  int exponent = (uf >> 23) & 0ff;
  int exp = exponent - 127;
  int frac = uf & 0x7fffff;

  if(exponent == 0x7F800000)
    return 0x80000000u;
  if(!exponent)
    return 0;
  if(exp < 0)
    return 0;
  if(exp > 30)
    return 0x80000000u;

  frac = frac | 0x800000;
  if (exp >= 23)
    frac = frac << (exp - 23);
  else
    frac = frac >> (23 - exp);

  if((uf >> 31) & 1)
    return ~frac + 1;

  return frac;
}
int float_f2i(无符号uf){
整数指数=(uf>>23)&0ff;
int exp=指数-127;
int frac=uf&0x7fffff;
如果(指数=0x7F800000)
返回0x80000000u;
如果(!指数)
返回0;
如果(exp<0)
返回0;
如果(exp>30)
返回0x80000000u;
分形=分形| 0x800000;
如果(exp>=23)
压裂=压裂>(23-exp);
如果((uf>>31)和1)
返回~frac+1;
回流压裂;
}

c
只有一个向右移位运算符
>
,但当数字是有符号值类型时,这只是一个算术移位

main()
{
  int x = -2;
  printf("%d\n",x>>1);
  printf("%d\n",((unsigned int)x)>>1);
  return 0;
}


因此,如果需要确保非算术移位,您可以强制转换为unsigned。

好的,谢谢。。。那么对于像0xbf080000(标准化值为-1.0625 x 2^(-1))这样的参数,我必须取这个值,强制转换为无符号,将其右移除以2,将其重新强制转换为有符号,然后使用适当的掩码将其转换为负?