2009年10月31日 星期六

進制轉換

 
10進位小數轉2進位:
//這種版本是刻意為之的 :-)

char* float_to_binary (float f)             //進制轉換
{
    const int N = 128;
    static char s[N];     
    char *p = s;
    int b=0, i=N, n=f;                      //b 將指向整數部分
                                            //最右端的位置
    while (i--) s[i] = '0';

    if (f < 0)  {++b; *p++='-'; n= f= -f;}  //處理負數
    if (n == 0) {++b; p++;}                 //若是 0
   
    if (n) {                                //算整數部分
        i = n; while (i>>=1) ++b;            
        p = s + b;
        i = n; do *p--+= i&1; while (i>>=1); 
        p = s + b + 1;
    }   
    *p++ = f-n ?'.': 0;                     //是否加小數點
    while (f -= n) *p+++= n = f*=2;         //算小數部分
    *p = 0;
    return s;
}

int main()
{
    cout << float_to_binary (-20.375);
}
若不處理小數:
#include <stdio.h>
int main () 
{
    for (int m,i=0; i<257 && printf("\n%3d\t",i); ++i)
        for (m=512; m=m>>1; putchar(i&m?49:48));
}
或者這樣:(注意: 在不同環境裡會有 Big/Little Endian 與 bit align 問題)
#include <stdio.h>
int main() 
{
    union {
        unsigned n;
        struct {unsigned a:1,b:1,c:1,d:1,e:1,f:1,g:1,h:1,i:1;};
        void pnt() {
            printf ("\n%3d\t%d%d%d%d%d%d%d%d%d", n,i,h,g,f,e,d,c,b,a);
        }
    } b = {0}; 
    while (++b.n<257) b.pnt();
}

沒有留言:

張貼留言