Đến nội dung

Hình ảnh

thuật toán đổi số thực sang dạng nhị phân

- - - - -

  • Please log in to reply
Chưa có bài trả lời

#1
Magus

Magus

    Trung tá

  • Hiệp sỹ
  • 2781 Bài viết
Cái này có người nhờ nên mình viết vào đây. Có lỗi sai ở đâu mong mọi người sửa giùm :geq

Đề 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=&#40;long&#41;n; //Lay phan nguyen
	nf=n-ni; // Lay phan thuc
	
	/* Chuyen phan nguyen sang he hai*/
	tmp=&#40;char*&#41;malloc&#40;sizeof&#40;char&#41;&#41;;
	do
	{
		bit=&#40;int&#41;ni%2;
		ni/=2;
		ibits++;
		tmp=&#40;char*&#41;realloc&#40;tmp,&#40;ibits+1&#41;&#41;;
		tmp&#91;ibits&#93;=bit;
	}while&#40;ni!=0&#41;;
	
	ibin=&#40;char*&#41;malloc&#40;ibits&#41;;
	ibin=reverse&#40;tmp&#41;; //Đảo chuỗi.
	
	//free&#40;tmp&#41;;
	
	/*Chuyen phan thap phan sang he 2*/ 
	fbin=&#40;char*&#41;malloc&#40;sizeof&#40;char&#41;&#41;;
	fbin&#91;0&#93;=&#39;.&#39;;
	do
	{
		nf*=2;
		bit=&#40;int&#41;&#40;nf&#41;;
		if&#40;nf>=1&#41; 
			nf-=1;
		fbits++;
		fbin=&#40;char*&#41;realloc&#40;fbin,&#40;fbits+1&#41;&#41;;
		fbin&#91;fbits&#93;=bit;
	}while&#40;nf>0E+8&#41;;

Nếu muốn chuyển số âm thì làm thêm phần lấy bù 2 là OK.
<div align="center"><img src="http://img221.images...4795706ld2.jpg" border="0" class="linked-image" /><br />

<!--fonto:Verdana--><span style="font-family:Verdana"><!--/fonto--><a href="http://diendantoanho...0&#entry168717" target="_blank">Hướng dẫn gõ công thức toán lên diễn đàn cho người mới</a><!--fontc--></span><!--/fontc--></div>

<br /><div align="center"><!--fonto:Verdana--><span style="font-family:Verdana"><!--/fonto--><a href="http://diendantoanho...howtopic=38505" target="_blank">Cách gõ công thức toán mới</a><br /><a href="http://diendantoanho...id=1&Itemid=18" target="_blank"><!--coloro:#008000--><span style="color:#008000"><!--/coloro--><b>Bạn có muốn gửi bài viết của mình lên trang chủ không?</b><!--colorc--></span><!--/colorc--></a><!--fontc--></span><!--/fontc--></div><br /><div align="center"><!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto--><!--sizeo:2--><span style="font-size:10pt;line-height:100%"><!--/sizeo-->em=Console.ReadLine();Console.Write("Anh yêu {0}",em);<!--sizec--></span><!--/sizec--><!--fontc--></span><!--/fontc--></div>




0 người đang xem chủ đề

0 thành viên, 0 khách, 0 thành viên ẩn danh