【问题标题】:How can I convert a binary number (32 bit) to a decimal number?如何将二进制数(32 位)转换为十进制数?
【发布时间】:2015-04-01 08:44:54
【问题描述】:

我见过各种程序,我可以将给定的十进制浮点数转换为 IEEE 754 格式的二进制数。
现在,给定一个二进制数,如何让 C 中的程序将其转换为浮点数?

例子:

Input:  01000001010010000000000001111111
Output: 12.50012111663818359375

【问题讨论】:

  • 大多数情况下,我们从编写一些代码开始。你写了吗?
  • 您确定十进制浮点数IEEE 754格式的二进制吗?你的输入看起来像一个二进制表示,可能是一个字符串,你可以使用strtol来解析它,输出可能是printf("%f", f)执行的字符串转换,所以你有一些开始编码的提示......
  • 嗯这适用于标题问题。 01000001010010000000000001111111 binary --> 1095237759 decimal.

标签: c binary ieee-754


【解决方案1】:

我假设您将二进制表示为string

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

void setBit(uint32_t* f, int i) {
    uint32_t mask = ((uint32_t)1) << i;
    *f |= mask;
}

float readFloat(const char* bits) {
    assert(strlen(bits)==8*sizeof(float));
    assert(sizeof(uint32_t)==sizeof(float));
    float f = 0;
    int size = strlen(bits);
    for (int i = 0; i < size; i++) {
        int bit = bits[size-i-1]- 0x30;
        if (bit) {
            setBit((uint32_t*)&f, i);
        }
    }
    return f;
}

int main(int argc, char *argv[]){
    const char* bits = "01000001010010000000000001111111";
    float f = readFloat(bits);
    printf("%s -> %.20f", bits, f);
}

01000001010010000000000001111111 -> 12.50012111663818359375

【讨论】:

  • 如果您关心 16 位平台的可移植性(在 2015 年的嵌入式单词中流行),uint32_t mask = 1u &lt;&lt; i; 是个问题,因为unsigned 可能只有 16 位。多种应对方式:uint32_t mask = ((uint32_t)1) &lt;&lt; i;uint32_t mask = 1LU &lt;&lt; i;uint32_t mask = UINT32_C(1) &lt;&lt; i;。我喜欢第一个。见stackoverflow.com/q/19451101/2410359
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2011-01-08
相关资源
最近更新 更多