-
进制相关
-
其他进制 ==> 十进制
二进制、八进制和十六进制向十进制转换都非常容易,就是“按权相加”;
例如:将八进制数字 423.5176 转换成十进制
//其他进制转换为十进制
//m:进制;ch:m进制的整数部分字符串,ch_f:m进制的小数部分字符串
double otherToTen(char *ch,char *ch_f,int m){
int a = strlen(ch);
int b = strlen(ch_f);
int i=0;
int j=-1;
double val=0;
while (a--){
val += (ch[a]-48)* pow(m,i++);
}
i=0;
while (i<b){
val += (ch_f[i]-48)* pow(m,j--);
i++;
}
return val;
}
int main() {
char ch[100];
int m;
while (scanf("%s%d",&ch,&m)!=EOF){
char *ch_f;
int i=0;
while (ch[i++]!='.');//按'.'分割字符串
ch[i-1] ='\0';
ch_f = &ch[i];
double val = otherToTen(ch,ch_f,m);
printf("%.11lf",val);
}
return 0;
}
-
十进制 ==> 其他进制
/**
* 整数部分
* 思路:除 m 取余,逆序排列
* 正整数(整数部分)=> 其他进制数
* n:输入的正整数;m:输入要转换为m进制
*/
void tenToOther(char *ch,int n,int m){
int count=0;
while (n){
ch[count++] = n%m+48;
n /= m;
}
int i=0,j=count-1;
while (i<j){
char c = ch[i];
ch[i] = ch[j];
ch[j] = c;
i++;
j--;
}
}
/**
* 小数部分
* 思路:乘 N 取整,顺序排列
* 正整数(小数部分)=> 其他进制数
* n:输入的正整数;m:输入要转换为m进制
*/
void tenToOther_f(char *ch,double n,int m){
int count=0;
while (n){
int x = (int)(n*m);
ch[count++] = x + 48;
n = n*m-x;
}
}
//整合整数和小数部分
int main() {
double n;
int m;
while (scanf("%lf%d",&n,&m)!=EOF){
char ch[100]={0};
char ch_f[100]={0};
int x = (int)n;
double y = n-x;
tenToOther(ch,x,m);
tenToOther_f(ch_f,y,m);
printf("%s.%s",ch,ch_f);
}
return 0;
}
-
二进制和八进制、十六进制的转换
- 二进制整数转换为八进制整数时,每三位二进制数字转换为一位八进制数字;八进制整数转换为二进制整数时,思路是相反的,每一位八进制数字转换为三位二进制数字
- 二进制整数转换为十六进制整数时,每四位二进制数字转换为一位十六进制数字;十六进制整数转换为二进制整数时,思路是相反的,每一位十六进制数字转换为四位二进制数字
-
字节相关
1个元器件称为1比特(Bit)或1位,8个元器件称为1字节(Byte)
1Byte = 8 Bit
一个字节最多可表示最大值为2^8 - 1 -
为什么int类型的最大值是2^31-1 ?
-
int类型是8个字节,32位,最大值用二进制表示就是, 0111...(总共31个1) 为什么第一位是0? 二进制里,最高位(第一位)表示符号 0表示正,1表示负
-
ASCII 编码
ASCII 是“American Standard Code for Information Interchange”的缩写,翻译过来是“美国信息交换标准代码”。
标准 ASCII 编码共收录了 128 个字符。
字符 | 十进制值 |
---|---|
‘A~Z’ | 65~90 |
‘a~z’ | 97~122 |
‘0~9’ | 48~57 |