Đề bài:
1. Đọc 1 số thực < 1, sau đó viết ra màn hình số đó dưới dạng nhị phân .
2. Đọc 1 số thực bất kì , sau đó viết ra màn hình số đó dưới dạng nhị phân
--------------
câu 1: Lấy số thực đó nhân hai cho tới khi nào tích = 1.0, Cứ mỗi lần nhân thì được hai phần phần nguyên và phần thập phân. giữ lại phần nguyên , phần thập phân lấy ra nhân tiếp.Cuối cùng số viết ở hệ nhị phân sẽ có giá trị=<phần nguyên 1><phân nguyên 2>...<phần nguyên n> Ví dụ:
0.4375*2=0.875=> phần nguyên=0; phần thập phân=0.875=>giữ lại số 0
0.875*2=1.75=>phần nguyên =1;phần thập phân=0.75=>giữ lại số 1
0.75*2=1.5=>phần nguyên =1;phần thập phân=0.5=>giữ lại số 1
0.5*2=1.0=>phần nguyên =1;phần thập phân=0=>giữ lại số 1
như vậy ta có:0,4375 hệ thập phân= 0.0111 ở hệ nhị phân.
Gợi ý:mỗi lần giữ lại bạn nên ghi vào mảng, sau đó xuất ra.
câu 2:Chia số thực đó thành hai phần, phần thập phân thì đổi như cách ở trên còn phần thập phân thì đổi như cách sau, sau đó ghép lại hai cái là dc.
cách đổi phần nguyên:
Lấy phần nguyên lần lượt chia cho hai sau đó giữ lại phần dư, lấy phần thương chia tiếp cho tới khi thương =0. Lấy các số dư vừa viết được ở trên đem viết ngược lại thì được số nhị phân. Mình ví dụ
đổi 13.4375 ra hệ nhị phân
13/2 thương =6 dư=1
6/2 thương =3 dư=0
3/2 thương =1 dư=1
1/2 thương =0 dư=1
vậy phần nguyên tức là số 13=1101 ở hệ nhị phân
còn phần thập phân 0,4375 đã đổi ở trên=0,0111
như vậy 13,4375=1101,0111
-----------------------
Có nhiều cách để chuyển một số hệ decimal(Hệ 10) sang hệ binary(nhị phân).
Xem qua cái code này xem. Đây là cách thông dụng.
int i,ibits,fbits,bit; long ni; double nf; char *ibin,*fbin,*tmp; ni=(long)n; //Lay phan nguyen nf=n-ni; // Lay phan thuc /* Chuyen phan nguyen sang he hai*/ tmp=(char*)malloc(sizeof(char)); do { bit=(int)ni%2; ni/=2; ibits++; tmp=(char*)realloc(tmp,(ibits+1)); tmp[ibits]=bit; }while(ni!=0); ibin=(char*)malloc(ibits); ibin=reverse(tmp); //Đảo chuỗi. //free(tmp); /*Chuyen phan thap phan sang he 2*/ fbin=(char*)malloc(sizeof(char)); fbin[0]='.'; do { nf*=2; bit=(int)(nf); if(nf>=1) nf-=1; fbits++; fbin=(char*)realloc(fbin,(fbits+1)); fbin[fbits]=bit; }while(nf>0E+8);
Nếu muốn chuyển số âm thì làm thêm phần lấy bù 2 là OK.