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(); }
沒有留言:
張貼留言