首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将二进制数分成几部分?C语言

如何将二进制数分成几部分?C语言
EN

Stack Overflow用户
提问于 2015-03-31 04:41:34
回答 1查看 616关注 0票数 0

我有一个需要将浮点数转换为IEEE754二进制表示的赋值。我已经完成了比特部分,但我不知道如何将数字分解为部分(信号,指数和分数)。下面是我的代码:

代码语言:javascript
复制
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的循环吗?我没有做那部分..。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-03-31 09:44:36

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

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

既然你已经完成了bits部分,你就可以将它存储到像uint32_t这样的东西中,或者如果值不大于31 (对结果有影响的符号),那么只存储一个int。

例如

代码语言:javascript
复制
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;

这将以与打印出的位相同的顺序存储位。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29355885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档