通过位域,简化转换二进制的循环结构
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;
void binary32_from_bit32_cpy(binary32 *, void *);
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;
}
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>
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;
}
- 结果