请问C语言怎么用数组完成负数的十进位转换成二进位?
本人小白一个,做课设,用数组做了个十进位转二进位的代码。刚刚发现了个问题 我居然把负数给忘了。其实我是知道基本原理的,但不会用代码实现它 有哪位大佬能帮帮我?
嗯……直接来段儿「能抄」的代码吧
#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;
}//似乎有点短。。。。
推荐阅读: