自己做的练习题,不知道对不对,自学只能做到这个程度,如果有更好的方法,麻烦留我一份,共同进步
int itob(int n, char *s, int b) {
if (s == NULL) {
return -1;
}
char buf[256];
char temp;
char *to = NULL, *from = NULL;
int v = n;
int i = 0, j = 0, sum = 0, k=0;
int l = sizeof(n) * 8; //计算n类型的位长
//先转为二进制
do
{
if (v & 1) { //v & 1后如果是1,则是1,否则为0
buf[i++] = '1';
}
else
{
buf[i++] = '0';
}
v >>= 1;
if (v == -1)// 如果是负数,右移最小值为-1,可以直接判断
{
buf[i++] = '1';
break;
}
} while (v != 0 );
if (n < 0) { //如果n是负数,高位0全部置1
while (i<l)
{
buf[i++] = '1';
}
}
buf[i--] = '\0';
l = i; //记录buf长度
switch (b)
{
case 2:
to = s;
v = 0;
from = buf;
//可以用strcpy(s,buf)代替
while ((*to++ = *from++) != '\0')
++v;
break;
case 8:
to = s;
v = 0;
k = 0;
do {
j = l >= 3 ? 2 : l; //每三位计算一次,如:111八进制位7,
sum = 0;
for (i=0;i<=j;++i) {
sum += (i == 2 && buf[k] == '1') ? 4 : 0; //三位值相加
sum += (i == 1 && buf[k] == '1') ? 2 : 0;
sum += (i == 0 && buf[k] == '1') ? 1 : 0;
++k;
}
++v;
*to++ = sum | '0'; //当前三位8进制值 赋值给s;
l -= 3; //buf长度减3
} while (l >= 0);
*to = '\0';
break;
//十六进制 类似 八进制计算方式
case 16:
to = s;
v = 0;
k = 0;
do {
j = l >= 4 ? 3 : l; //每三位计算一次,如:1111八进制位15,
sum = 0;
for (i = 0;i <= j;++i) {
sum += (i == 3 && buf[k] == '1') ? 8 : 0;
sum += (i == 2 && buf[k] == '1') ? 4 : 0;
sum += (i == 1 && buf[k] == '1') ? 2 : 0;
sum += (i == 0 && buf[k] == '1') ? 1 : 0;
++k;
}
++v;
*to++ = sum < 10 ? sum | '0' : (sum - 10) + 'A'; //如果sum小于10,则转换成数字字符
//否则转换成对应的十六进制字母字符
l -= 4;
} while (l >= 0);
*to = '\0';
break;
}
--v;
//反转
for (j = 0;j < v;++j, --v) {
temp = s[j];
s[j] = s[v];
s[v] = temp;
}
return 0;
}
3-5 编写函数itob
最新推荐文章于 2023-03-27 19:55:30 发布