請問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;
}//似乎有點短。。。。
推薦閱讀: