【问题标题】:C Bitwise Logic Operations PuzzleC 位逻辑运算谜题
【发布时间】:2013-02-13 04:48:50
【问题描述】:

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

float_f2i

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

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

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

所以我从中得到的是,我得到了一个十六进制的数字,我必须编写代码以将其转换为整数格式。给我们的一个测试用例是; Argument [0x00800000], returns [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
  }
}

我知道要使其工作,我必须将指数部分添加到返回语句 (1.frac^(exp-127)),但我不知道如何编码。向左移动乘以两个,但对于 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;
}

【问题讨论】:

    标签: c operators bits


    【解决方案1】:

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

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

    Run it here

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

    【讨论】:

    • 好的,谢谢...那么对于像 0xbf080000(归一化值为 -1.0625 x 2^(-1))这样的参数,我必须取值,强制转换为无符号,将其右移到除以二,将其重新转换为已签名,然后使用适当的掩码 OR 以获取负数?
    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多