快速二进制转换

625 阅读2分钟

通过位域,简化转换二进制的循环结构

  • 应用位域,定义一个32位二进制的结构体
//32位二进制结构体
typedef struct {
    unsigned int b00 : 1, b01 : 1, b02 : 1, b03 : 1, b04 : 1, b05 : 1, b06 : 1, b07 : 1, b08 : 1, b09 : 1,
    b10 : 1, b11 : 1, b12 : 1, b13 : 1, b14 : 1, b15 : 1, b16 : 1, b17 : 1, b18 : 1, b19 : 1,
    b20 : 1, b21 : 1, b22 : 1, b23 : 1, b24 : 1, b25 : 1, b26 : 1, b27 : 1, b28 : 1, b29 : 1,
    b30 : 1, b31 : 1;
} binary32;
  • 定义转换函数
//32位数据结构 转 32位二进制结构 值拷贝
void binary32_from_bit32_cpy(binary32 *, void *);

//32位数据结构 转 32位二进制结构 原址操作
binary32 *binary32_from_bit32(void *);

void binary32_from_bit32_cpy(binary32 *b, void *val) {
    *b = *(binary32 *)val;
}

binary32 *binary32_from_bit32(void *val) {
    return (binary32 *)val;
}
  • 定义其他应用函数 二进制1的个数
//二进制1的个数
int binary32_bit_count(binary32 *);

int binary32_bit_count(binary32 *b) {
    return b->b00 + b->b01 + b->b02 + b->b03 + b->b04 + b->b05 + b->b06 + b->b07 + b->b08 + b->b09
           + b->b10 + b->b11 + b->b12 + b->b13 + b->b14 + b->b15 + b->b16 + b->b17 + b->b18 + b->b19
           + b->b20 + b->b21 + b->b22 + b->b23 + b->b24 + b->b25 + b->b26 + b->b27 + b->b28 + b->b29
           + b->b30 + b->b31;
}
  • 定义其他应用函数 二进制字符串
//分配内存
#include <stdlib.h>

//二进制格式化字符串 需自行free字符串
void binary32_to_char(binary32 *, char **);

void binary32_to_char(binary32 *b, char **str_ptr) {
    *str_ptr = calloc(33, sizeof(char));
    (*str_ptr)[32] = '\0';
    (*str_ptr)[31] = b->b00 + '0';
    (*str_ptr)[30] = b->b01 + '0';
    (*str_ptr)[29] = b->b02 + '0';
    (*str_ptr)[28] = b->b03 + '0';
    (*str_ptr)[27] = b->b04 + '0';
    (*str_ptr)[26] = b->b05 + '0';
    (*str_ptr)[25] = b->b06 + '0';
    (*str_ptr)[24] = b->b07 + '0';
    (*str_ptr)[23] = b->b08 + '0';
    (*str_ptr)[22] = b->b09 + '0';
    (*str_ptr)[21] = b->b10 + '0';
    (*str_ptr)[20] = b->b11 + '0';
    (*str_ptr)[19] = b->b12 + '0';
    (*str_ptr)[18] = b->b13 + '0';
    (*str_ptr)[17] = b->b14 + '0';
    (*str_ptr)[16] = b->b15 + '0';
    (*str_ptr)[15] = b->b16 + '0';
    (*str_ptr)[14] = b->b17 + '0';
    (*str_ptr)[13] = b->b18 + '0';
    (*str_ptr)[12] = b->b19 + '0';
    (*str_ptr)[11] = b->b20 + '0';
    (*str_ptr)[10] = b->b21 + '0';
    (*str_ptr)[9] = b->b22 + '0';
    (*str_ptr)[8] = b->b23 + '0';
    (*str_ptr)[7] = b->b24 + '0';
    (*str_ptr)[6] = b->b25 + '0';
    (*str_ptr)[5] = b->b26 + '0';
    (*str_ptr)[4] = b->b27 + '0';
    (*str_ptr)[3] = b->b28 + '0';
    (*str_ptr)[2] = b->b29 + '0';
    (*str_ptr)[1] = b->b30 + '0';
    (*str_ptr)[0] = b->b31 + '0';
}
  • 实际函数应用
#include "binary.h"
#include <stdio.h>

int main(void) {

    binary32 b;
    int i = 666;
    //值拷贝式转换
    binary32_from_bit32_cpy(&b, &i);
    char *str;
    //二进制字符串
    binary32_to_char(&b, &str);
    printf("%d 二进制:%s\n", i, str);
    printf("%d 二进制有 %d 个 1\n", i, binary32_bit_count(&b));
    
    printf("\n");
    
    float f = 666.666f;
    //值拷贝式转换
    binary32_from_bit32_cpy(&b, &f);
    //二进制字符串
    binary32_to_char(&b, &str);
    printf("%g 二进制:%s\n", f, str);
    printf("%g 二进制有 %d 个 1\n", f, binary32_bit_count(&b));
    
    //释放字符串内存
    free(str);

    return 0;
}
  • 结果 结果