Chuyển đổi hệ nhị phân

Viết chương trình nhập vào 1 dãy 16 bit nhị phân (có dấu), chuyển đổi dãy bit nhị
phân sang số thập phân tương ứng.
Em giải bằng phương pháp bù 1 như sau:

#include <iostream>
#include <math.h>
using namespace std;
void henhiphan(int n)
{
	int i = 0, dec = 0, k = 0, m = n, p, a[50];
	while (m != 0)
	{
		m /= 10;
		i++;
	}
	p = n;
	if (i < 15)
	{
		while (k != 16)
		{
			a[k] = p % 10;
			p = p / 10;
			if (a[k] == 0)
				a[k] = 1;
			else
			{
				a[k] = 0;
			}
			k++;
		}
		for (int q = k - 1; q >= 0; q--)
		{
			dec += a[q] * pow(2, q);
		}
		dec = -dec;
		cout << "dec = " << dec;
	}
	else
	{
		while (k != 16)
		{
			a[k] = p % 10;
			p /= 10;
			k++;
			for (int q = k - 1; q >= 0; q--)
			{
				dec += a[q] * pow(2, q);
			}
		}
	}
	cout << "dec = " << dec;
}
int main()
{
	int n;
	cout << "Nhap so nguyen he nhi phan: "; cin >> n;
	henhiphan(n);
	return 0;
}

Kết quả của em bị sai mọi người xem giúp em code bị sai ở đâu với. Em cám ơn nhìu ạ

Code của bạn sai ở chỗ không đúng chỗ nào cả.

  1. Giới hạn của số int là 2147483648 như vậy biến n trong main tối đa là 10 chữ số 1. Có nghĩa là i trong hàm henhiphan i tối đa là 10.
  2. khi i < 15, số bạn nhập là số dương. nghĩa là 0b1 = 0x01 = 1. trong khi đó bạn lại đảo lại thành 0b111111111111110 = 0xFFFE = 65534. (vì int trong cpplaf 32 bit)
  3. Giả sử kiểu int bạn dùng là 16 bit thì 0b111111111111110 = -2, chứ không phải -1.
  4. Khi i >= 15, vòng for trong vòng lặp while lại càng sai.

Sửa lại.

  1. Input là kiểu string. và kiểm tra string đúng hay chưa
  2. Nếu string input có len < 16, pad left với số 0
  3. Lặp trong chuỗi string (từ charactor 1: 15) và cộng dồn dec += a[q] * pow(2, (15-q))
  4. Nếu charactor đầu tiên của input string là 1 đảo dấu theo quy tắc bù dec-32767 - 1

Nhớ kiểm tra xeminput string chỉ gồm các ký tự 0 và 1.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?