【问题标题】:How do I break a binary number in parts? C language如何分段分解二进制数? C语言
【发布时间】:2015-06-04 00:57:01
【问题描述】:

我有一个任务要求我将浮点数转换为 IEEE 754 二进制表示。我已经完成了位部分,但我不知道如何将数字分成几部分(信号、指数和分数)。这是我的代码:

typedef unsigned char Byte;

void showbits(char str[], Byte data[], int size) {

    int i, j;
    int bit;



    printf ("%s = ", str);

    for(i = size-1; i>=0; i--){
        for(j = 7; j >= 0; j--){
            bit = (data[i] >> j) & 1;

            printf ("%d", bit);
        }
        printf (" ");
    }
    printf ("\n");
    printf("signal: %d\n", (data[size - 1] >> 7) & 1);

    printf("exponential: ");

            printf("%d", (data[size-2] >> 6) & 1);
            printf("%d", (data[size-3] >> 5) & 1);
            printf("%d", (data[size-4] >> 4) & 1);
            printf("%d", (data[size-5] >> 3) & 1);
            printf("%d", (data[size-6] >> 2) & 1);
            printf("%d", (data[size-7] >> 1) & 1);
            printf("%d", (data[size-8] >> 0) & 1);
            printf("%d", (data[size-9] >> 7) & 1);

    printf("\nfraction: ");

            printf("%d", (data[21] >> 6) & 1);
            printf("%d", (data[20] >> 5) & 1);
            printf("%d", (data[19] >> 4) & 1);
            printf("%d", (data[18] >> 3) & 1);
            printf("%d", (data[17] >> 2) & 1);
            printf("%d", (data[16] >> 1) & 1);
            printf("%d", (data[15] >> 0) & 1);
            printf("%d", (data[14] >> 7) & 1);
            printf("%d", (data[13] >> 6) & 1);
            printf("%d", (data[12] >> 5) & 1);
            printf("%d", (data[11] >> 4) & 1);
            printf("%d", (data[10] >> 3) & 1);
            printf("%d", (data[9] >> 2) & 1);
            printf("%d", (data[8] >> 1) & 1);
            printf("%d", (data[7] >> 0) & 1);
            printf("%d", (data[6] >> 7) & 1);
            printf("%d", (data[5] >> 6) & 1);
            printf("%d", (data[4] >> 5) & 1);
            printf("%d", (data[3] >> 4) & 1);
            printf("%d", (data[2] >> 3) & 1);
            printf("%d", (data[1] >> 2) & 1);
            printf("%d", (data[0] >> 1) & 1);

}

int main(int argc, const char * argv[]) {

    float f;

    scanf("%f", &f);

    showbits("float", (Byte *)&f, sizeof(float));

    return 0;
}

另外,有人能解释一下为什么那里有一个从 7 开始到 0 的循环吗?我没有做那部分... 谢谢!

【问题讨论】:

  • 为什么不能按原样显示f 的一部分?它们已经在 IEEE 754 表示中
  • 作业要求我把它分解成几部分,并说出哪一部分是哪一部分..
  • 还是一样。标准对于固定位置有固定的含义,所以我看不出有什么问题。
  • 是的,但是我如何打破它,以便第一位在一个 printf 中,接下来的 8 位在另一个 printf 中,最后 23 位在最后一个 printf 中?
  • 我有点醉了,但对我来说,你试图查看太多字节...数据只有 4 个字节

标签: c binary break bits ieee


【解决方案1】:

“另外,有人能解释一下为什么那里有一个从 7 开始到 0 的循环吗?我没有做那部分......谢谢!”

这个循环是处理一个字节——因为一个字节是 8 位,所以从 7 开始到包含 0。它的 & 1 部分是为了确保只有一个位存储在变量位中.这个循环的作用是逐字节打印出来。

由于您已经完成了位部分,因此您可以将其存储到 uint32_t 之类的内容中,如果值不大于 31(符号对结果有影响),则可以仅将其存储为 int

例如

uint32_t exp = 0;
printf("exponential: ");

        exp |= ((data[size-2] >> 6) & 1) << 7;
        exp |= ((data[size-3] >> 5) & 1) << 6;
        exp |= ((data[size-4] >> 4) & 1) << 5;
        exp |= ((data[size-5] >> 3) & 1) << 4;
        exp |= ((data[size-6] >> 2) & 1) << 3;
        exp |= ((data[size-7] >> 1) & 1) << 2;
        exp |= ((data[size-8] >> 0) & 1) << 1;
        exp |= (data[size-9] >> 7) & 1;

这将按照打印出来的顺序存储这些位。

【讨论】:

  • size 将是 4 浮点数,所以你的 data[size-5] 等等都是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多