c语言--位操作实现ftoi

ftoi

将浮点数转换成浮点数

浮点数的存储方式

0 : 符号位
1-8 : 指数位
9-31 : 尾数位
可以写个函数来输出浮点数的存储情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void print_bits(float value)
{

int i = 0;
int n_value = 0;

memcpy(&n_value, &value, 4);

for(i = sizeof(n_value) * 8 - 1; i >= 0; --i){
printf("%d", n_value >> i & 1);
if((i & 7) == 0){
printf(" ");
}
}
printf("\n");
}

12.5为例,输出为01000001 01001000 00000000 00000000

ftoi函数的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int ftoi(float value)
{


int flag = 0;
int index = 0;
int tail = 0;
int n_value = 0;

memcpy(&n_value, &value, 4);

//抽取符号位
flag = ((n_value >> ((32) - 1) & 1) == 0 ? 1 : -1);

//抽取指数位
index = (((n_value >> (23)) & (0xFF)) - (127));

//抽取尾数位
tail = (n_value & (0x7FFFFF) | 1 << (23));

if(index < 0){ //如果指数小于0,说明该数小于1,直接返回0
return 0;
}


//将尾数右移得到整数部分
tail >>= ((23) - index);
return tail * flag;
}

用宏定义实现数的抽取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int ftoi(float value);

#define BIT_LENGTH (32)
#define TAIL_LENGTH (23)
#define INDEX_ZERO (127)
#define INDEX_LENGTH (0xFF)
#define TAIL_MATCH_LENGTH (0x7FFFFF)

#define get_float_flag(val) ((val >> (BIT_LENGTH - 1) & 1) == 0 ? 1 : -1)
#define get_float_index(val) (((val >> TAIL_LENGTH) & INDEX_LENGTH) - INDEX_ZERO)
#define get_float_tail(val) (val & TAIL_MATCH_LENGTH | 1 << TAIL_LENGTH)

// 12.5 == 1100.1 1.1001 * 2 ^ 3

int ftoi(float value)
{

//抽取符号位、指数位和尾数位的内容
int flag = 0;
int index = 0;
int tail = 0;
int n_value = 0;

memcpy(&n_value, &value, 4);

//得到符号位
flag = get_float_flag(n_value);
//得到指数位
index = get_float_index(n_value);
//得到尾数位
tail = get_float_tail(n_value);

if(index < 0){ //如果指数位小于零,说明没有整数部分,返回0
return 0;
}
// 1100 1000 0000 0000 0000 0000
// 0000 0000 0000 0000 0000 1100

tail >>= (TAIL_LENGTH - index);
return tail * flag;
}
Contents
  1. 1. ftoi
    1. 1.1. 浮点数的存储方式
    2. 1.2. ftoi函数的实现
    3. 1.3. 用宏定义实现数的抽取
,