本人小白一個,做課設,用數組做了個十進位轉二進位的代碼。剛剛發現了個問題 我居然把負數給忘了。其實我是知道基本原理的,但不會用代碼實現它 有哪位大佬能幫幫我?


嗯……直接來段兒「能抄」的代碼吧

#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;
}//似乎有點短。。。。


推薦閱讀:
相关文章