本人小白一个,做课设,用数组做了个十进位转二进位的代码。刚刚发现了个问题 我居然把负数给忘了。其实我是知道基本原理的,但不会用代码实现它 有哪位大佬能帮帮我?


嗯……直接来段儿「能抄」的代码吧

#include &
#include & /* itoa() */
#include &

#define ARR_LEN 255

/* 10进位数转任意进位 */
/* 除基数取余:10进位数不断除以进位基数直至为0,每次相除取得余数之逆序即为转换结果 */
/* 参数说明 */
/* int value : 10进位数 */
/* char *string : 转换后的其他进位数,以字元串形式存储 */
/* int radix : 转换目标进位 */
char *decimal2Others (int value, char *string, int radix) {
char index[] = "0123456789abcdefghijklmnopqrstuvwxyz"; /* 索引表 */
unsigned uvalue; /* 无符号整型的中间变数,用于处理负数 */
char temp;
int i=0, j, k;

/* 确定uvalue的值 */
if (radix==10 value&<0) { /* 十进位负数 */ uvalue = (value*-1); string[i++] = -; } else uvalue = (unsigned)value; /* (unsigned)value == 2^32 - value (4位元组unsigned) */ /* 除基数取余 */ /* 计算结果存入string字元串,此时为最终转换结果的逆序 */ do { string[i++] = index[uvalue % radix]; uvalue /= radix; } while (uvalue); string[i] = ; /* string字元串末尾补 */ /* 逆序处理 */ /* string字元串首尾元素依次交换 */ if (string[0]==-) /* 十进位负数 */ k = 1; /* 跳过负号 */ else k = 0; for (j=k; j&<=(i-1)/2.0; j++) { temp = string[j]; string[j] = string[i-1-j+k]; string[i-1-j+k] = temp; } return string; } int main (void) { int radix, value; char result[ARR_LEN]; value = -10; printf ("The decimal number: %d ", value); putchar ( ); radix = 2; decimal2Others (value, result, radix); printf ("The binary numeric value: "); puts (result); itoa (value, result, radix); /* itoa() 函数验证 */ printf ("Calling the "itoa()" function: "); puts (result); putchar ( ); getch (); /*屏幕暂留*/ return 0; }

运行结果


class Smile {
private:
bool IsNum(char Ch) {
return (Ch &>= 0 Ch &<= 9); } int StrToInt(char* Str) { // 字元串转为整数, 忽略无效字元; if(!Str || !*Str) { return 0; } char* p = Str; char Ch = *p; int Sig = 1; // 考虑负数; if(- == Ch) { Sig = -1; ++p; } else if(+ == Ch) { ++p; } int Sum = 0; for(; *p; ++p) { Ch = *p; if(IsNum(Ch)) { Sum = 10 * Sum + Ch - 0; } } return (Sig * Sum); } public: char* Change(char* Str, int N, bool UpCase = true) { // Str 表示的十进位数字, 返回表示其 N 进位的字元串; // 当 N &> 10 时, 若 UpCase = true, 则用大写字母表示大于 9 的数;
// 否则用小写字母表示;
int Sum = StrToInt(Str);
int sig = 1;
int Wid = 2; // 返回的字元串需要多少位;
const char Letter = (UpCase ? A : a) - 10;
if(Sum &< 0) { // 注意负数的情况; ++Wid; sig = -1; Sum *= -1; } if(Sum &< N) { char* Ar = (char*) calloc (Wid, sizeof(char)); char* p = Ar - 1; if(sig &< 0) { *(++p) = -; } if(Sum &>= 10) {
*(++p) = Sum + Letter;
} else {
*(++p) = Sum + 0;
}
*(++p) = ;
return (Ar);
}
int a = N;
Wid = 3;
for(; (a *= N) &<= Sum; ++Wid); char* Ar = (char*) calloc (Wid, sizeof(char)); *Ar = 0; char* p = Ar + Wid; *p = ; for(; Sum &> 0; Sum /= N) {
*(--p) = 0 + Sum % N;
}
if(sig &< 0) { *(--p) = -; } if(0 == *Ar) { ++Ar; // 去掉首位多余的0; } if(N &<= 10) { return (Ar); } for(p = Ar; *p; ++p) { a = *p - 0; if(a &> 9) {
*p = Letter + a;
}
}
return (Ar);
}
};

我暂时只写了这些,可能还有问题,朋友可

[公式] ;


1 先把负数取绝对值 abs()

2 再把上一步的绝对值转二进位

3 最后根据负数的补码规则:把上一步的二进位按位取反后加一即可


先把正数的二进位搞出来,然后用补码的规则就行了。


为什么不用位运算呢?

这个可能有些不讲武德,和现有代码兼容性比较好的方法:指针的妙用。

用一个基类型为unsigned int的指针指向要转换的数,接下来你只要用现有代码对unsigned int转换就行了


windows下可以用itoa函数

itoa函数位于stdlib.h

#include&
#include&
int main()
{
int value;
char buffer[100];
scanf("%d",value);
itoa(value,buffer,2);
printf("%s
",buffer);
return 0;
}//似乎有点短。。。。


推荐阅读:
相关文章