昨天做帮朋友做了个带小数的二进制转换,才发现内置函数中不支持带小数转换二进制,写了个python语法的,朋友说要C语言的,C语言不太熟系杂乱写了一通。
根据转换规则写了转换的方法。
整数 转 二进制 规则:
将 整数除以2,记录余数部分,整数部分在进行多次除以2,直到整数为0为止。
余数部分从后往前(倒序记录)进行记录,就是整数的二进制。
小数 转 二进制 规则:
将小数乘以2,记录整数部分,去除整数。循环进行整数为0为止。
整数部分从上往下(顺序记录)进行记录,就是小数的二进制。
python语法
num = 6.125
int_str = fraction_str = ""
int_num = int(num) # 获取整数部分
fraction_num = num % 1 # 获取小数部分
# 整数 转 二进制
while int_num: # 整数为0退出
int_str += str(int_num % 2) # 除以2记录余数
int_num //= 2 # 除以2获取整数
int_str = int_str[::-1] # 将余数颠倒
# 小数 转 二进制
while fraction_num: # 小数为0退出
fraction_num *= 2 # 乘以2
fraction_str += str(int(fraction_num)) # 记录整数
fraction_num = fraction_num % 1 # 去除整数
num_bin = "%s.%s" % (int_str, fraction_str) if fraction_str else int_str
print("转二进制为:%s" % num_bin)
C语言语法
c语言语法不太熟系,写得有点杂乱。欢迎评论提点。
#include <stdio.h>
#include <math.h>
#include <string.h>
string_change(char * p) // 字符串翻转
{
int i,len;
char temp;
len = strlen(p)-1;
for(i=0; i<(len/2); i++)
{
temp = p[i];
p[i] = p[len-i];
p[len-i] = temp;
}
}
int main() {
double num=6.125, temp_d;
double fractionNum = modf(num, &temp_d);
int intNum, temp_int=0, index=0;
char intStr[50]="", fractionStr[50]="", temp_s[2]="";
intNum = (int)temp_d;
// temp_d,temp_s,temp_d是临时变量
while(intNum) {
itoa(intNum % 2, temp_s, 10); // 整数转字符串
strcat(intStr, temp_s); // 连接字符串
intNum = intNum / 2;
index++;
}
string_change(intStr); // 整数二进制需要翻转
index=0;
while(fractionNum){
fractionNum = fractionNum*2;
itoa((int)fractionNum, temp_s, 10);
strcat(fractionStr, temp_s);
fractionNum = modf(fractionNum, &temp_d);
index++;
}
if(fractionStr){
printf("转二进制为:%s.%s", intStr,fractionStr);
} else{
printf("转二进制为:%s", intStr);
}
return 0;
}
同理8进制、16进制也是如此,把2改成8或16(16要把大于9的数转成字母)
python语法
num = 6.125
int_str = fraction_str = ""
int_num = int(num) # 获取整数部分
fraction_num = num % 1 # 获取小数部分
# 16进制字典
dic_hex = {**{i: str(i) for i in range(10)}, **{i: chr(i+87) for i in range(10, 16)}}
print(dic_hex)
# 整数 转 二进制
while int_num:
int_str += dic_hex[int_num % 16] # 除以2获取余数
int_num //= 16 # 除以2获取整数
int_str = int_str[::-1] # 将余数颠倒
# 小数 转 二进制
while fraction_num:
fraction_num *= 16 # 乘以2
fraction_str += dic_hex[int(fraction_num)] # 获取整数部分
fraction_num = fraction_num % 1 # 去除整数
num_bin = "%s.%s" % (int_str, fraction_str) if fraction_str else int_str
print("转十六进制为:%s" % num_bin)