Chuyển hex sang dec trong C

Để hiển thị số hệ 10 sang các hệ khác, thông thường chúng ta nghĩ đến cách đổi chúng ra các hệ kia bằng thuật toán. Nếu muốn vậy bạn có thể tìm thêm trên Google đã có nhiều bài viết về các thuật toán đó rồi, ở đây mình nêu một số cách mà chúng ta không cần dùng thuật toán mà có thể hiển thị ngay.

VD: Nhập 1 số hệ 10 rồi xuất ra hệ 16.

#include 
#include 

void Hex(int n) 
{
	if (n < 16) 	
	{
		printf("%c","0123456789ABCDEF"[n]);	// hien thi ky tu thu n trong chuoi
		return;
	} 
	else Hex(n / 16);
	printf("%c","0123456789ABCDEF"[n % 16]);
}

int main() {
	int n;
	printf("Enter your number: ");
	scanf("%d", &n);
	printf("Number in hex:");
	Hex(n);
	return 0;
}

Nếu bạn để ý kỹ thì trong code trên chúng ta vẫn sử dụng thuật toán chia cho 16 dùng đệ quy. Cách này cũng áp dụng tốt cho hệ 2 và hệ 8. Ngoài ra chúng ta có thể sử dụng hàm ltoa để chuyển đổi (các bạn tự search).
Vậy không dùng thuật toán thì làm thế nào? Đơn giản như sau:

#include 
#include 

int main()
{
	int n;
	printf("Enter your number: ");
	scanf("%d", &n);
	printf("Number in hex: %X", n); // in ra so Hex bang dinh dang %X
	return 0;
}

Thật đơn giản và ngắn gọn phải không? :D.

Thông tin thêm:
Để biểu diễn một số thuộc kiểu gì đó dưới dạng một số hệ nào đó: ví dụ bạn nhập vào một số nguyên giờ muốn biểu diễn nó lên màn hình.
– Định dạng hệ 10 sử dụng %d
– Định dạng hệ 8 sử dụng %o
– Định dạng hệ 16 sử dụng %x (hoặc X để viết hoa các chữ cái)

Để ý, chúng ta có thể nhập được số hệ 16 hay hệ 8 và in ra các hệ 8, 10, 16 mà bạn muốn.
VD nhập vào số hệ 16 in ra số hệ 8, hệ 10.

#include 
#include 

int main()
{
	int n;
	printf("Enter your number in Hex: ");
	scanf("%x", &n);
	printf("Number in Oct: %on", n);
	printf("Number in Dec: %dn", n);
	return 0;
}

KQ:

Enter your number in Hex: D2F
Number in Oct: 6457
Number in Dec: 3375

Tham khảo thêm:
Sự khác nhau giữa %d và %i trong lập trình C
In ra số hex
convert một số hệ thập phân sang hệ 16 hoặc hệ 2, theo cách nhanh nhất


View Full Version : Kỹ thuật C++ Đổi số thập phân sang nhị phân và thập lục phân!



phanvanngoc

25-05-2010, 12:08 PM

Viết chương trình nhập vào một số
1/đổi số đó ra dưới dạng nhị phân
2/thập lục phân


chjp xinh kut3

25-05-2010, 12:32 PM

Viết hàm đổi một số nguyên không âm thành xâu Hecxa.Viết chương trình nhập vào từ bàn phím số nguyên không âm n, áp dụng hàm trên tìmvà in ra màn hình xâu Hecxa tương ứng.
Bỏ lâu rồi ko biết làm lại có đúng ko nữa. :(

#include
#include

void hexa(int n)
{int i=0,j=0;
int a[20];
while (n!=0)
{a[j]=n%16;n=n/16;j++;}
for(i=j;i>=0;i--)
{if (a[i]<10) printf("%d",a[i]);
else
switch (a[i])
{case 10: printf("A");break;
case 11: printf("B");break;
case 12: printf("C");break;
case 13: printf("D");break;
case 14: printf("E");break;
case 15: printf("F");break;
}
}
}

void main()
{clrscr();
int n;
tiep:printf("\nBan hay nhap so can chuyen doi: ");
scanf("%d",&n);
if (n<0) goto tiep;
printf("\n\nMa Hexa cua so vua nhap la: ");
printf("\n\n\t\t");
hexa(n);
printf("\n\nChuc vui. Chjp.");
getch();
}

Thử cái này xem

#include
#include

void main()
{
clrscr();
int number;
char hex[] = "0123456789ABCDEF";

nhap:printf("\nNhap vao mot gia tri nguyen duong 16 bit : ");
scanf("%u", &number);
printf("Gia tri Hex tuong ung = %c%c%c%c",
hex[number/0x1000], hex[(number/0x100)%0x10],
hex[(number/0x10)%0x10], hex[number%0x10]);

getch();
}

//Đổi số nhị phân
void main()
{
//nhập n la số cần đổi
for(i=7;i>0;i--)
printf("%d",(n>>i)&1);

}


cuong89hvktqs

25-05-2010, 11:20 PM

tui có bài đỏi sang nhị phân dùng stack,bạn có dùng tạm thì dùng.

#include
#include
#include
#include
using namespace std;
typedef struct DL
{
int arg;
struct DL *next;
}stack;
stack *push(stack*,int);
void doi(stack *,int);
int pop(stack*);
stack *start=NULL;

/******************main**************************** ****/
int main()
{
int m;
printf("\n Nhap so can doi: ");
scanf("%d",&m);
doi(start,m);
printf("\n Day nhi phan thu duoc:\n");
while(start!=NULL)
{
cout< start=start->next;
}
getch();
free(start);
}
/***************khoi tao danh sach ngan xep*************************/
stack *push(stack *p,int n)
{
if(p==NULL)
{
p=(stack*)malloc(sizeof(stack));
p->arg=n;
p->next=NULL;
}
else
{
stack *temp;
temp=(stack*)malloc(sizeof(stack));
temp->arg=n;
temp->next=p;
p=temp;
}
return (p);
}

/*******************doi tu co so 10 sang co so 2*************************/
void doi(stack *p,int n)
{
stack *temp;
temp=p;
while(n/2!=0)
{
temp=push(temp,n%2);
n=n/2;
}
temp=push(temp,n%2);
}
/*****************in ra tung phan tu trong danh sach********************/
int pop(stack *p)
{
stack *temp1,*q;
int a;
temp1=p;
a=temp1->arg;
q=temp1;
return a;
free(q);
}


peterdrew

06-07-2010, 03:18 PM

Giải quyết trọn vẹn và tổng quát là chuyển một số (hệ 10) sang một hệ cơ số bất kỳ:

#include
#include

void Chuyen_10_K(unsigned n,unsigned k)
{
if (n>=k)
Chuyen_10_K(n/k,k);
printf("%c",(n%k)["0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"]);
}

int main()
{
unsigned n,k;
printf("Nhap vao so can chuyen: ");
scanf("%d",&n);
printf("Nhap vao co so can doi sang: ");
scanf("%d",&k);
printf("So %d sau khi chuyen sang co so %d la: ",n,k);
Chuyen_10_K(n,k);
getch();
return 0;
}

Chú ý: Code trên chỉ chuyển sang hệ cơ số không quá 36.


hienclubvn

08-07-2010, 07:49 PM

printf("%c",(n%k)["0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"]); các bác cho em hỏi dòng lệnh trên có ý nghĩa như thế nào?
thấy bài anh Peter hay quá, mà chưa hiểu....

và xem cho em bài này luôn. em làm mà kết quả ko đúng.
phát triễn trên tư tưởng này, tối ưu hộ em luôn.

#include
#include
using namespace std;
int doi2qua10(int n)
{
int s=0,temp,i=0;
while(n!=0)
{
temp=n%10;
n=n/10;
if(temp==1)s+=int(pow(2,i++));
else i++;
}
return s;
}
void doi10qua2(int n)
{
int a[10],i;
for(i=0;i<8;i++) a[i]=0;
while (n!=0)
{
a[--i]=n%2;
n=n/10;
}
for(i=0;i<8;i++)cout< }
int main ()
{
int n=100111011;
cout< doi10qua2(11); // kết quả phải là 1011 nhưng mà nó lại cho ra 0011
system("pause");
}


tauit_dnmd

08-07-2010, 08:21 PM

các bác cho em hỏi dòng lệnh trên có ý nghĩa như thế nào?
thấy bài anh Peter hay quá, mà chưa hiểu....

@Hiênclub: đó là 1 cách truy cập 1 phần tử của mảng đó em.
VD: a[i] <=> i[a] .

#include
using namespace std;
int main()
{
int a[9]={1,2,3,4,5,6,7,8,9};
for(int i=0;i<9;i++)
{
cout< }
return 0;
}

và xem cho em bài này luôn. em làm mà kết quả ko đúng.
phát triễn trên tư tưởng này, tối ưu hộ em luôn.

#include
#include
using namespace std;
int doi2qua10(int n)
{
int s=0,temp,i=0;
while(n!=0)
{
temp=n%10;
n=n/10;
if(temp==1)s+=int(pow(2,i++));
else i++;
}
return s;
}
void doi10qua2(int n)
{
int a[10],i;
for(i=0;i<8;i++) a[i]=0;
while (n!=0)
{
a[--i]=n%2;
n=n/10;
}
for(i=0;i<8;i++)cout< }
int main ()
{
int n=100111011;
cout< doi10qua2(11); // kết quả phải là 1011 nhưng mà nó lại cho ra 0011
system("pause");
}

Hienclub:
Em sửa lại:

void doi10qua2(int n)
{
int a[10],i;
for(i=0;i<10;i++) a[i]=0;
i=9;
while (n!=0&&i>=0)
{
a[i--]=n%2;
n=n/2;
}
for(i=0;i<10;i++)cout< }


hienclubvn

08-07-2010, 08:31 PM

Oaa!!
Hay quá, giờ mới bít, cảm ơn anh tauit nhiều nha.

hịc, trời ạ!!
em sai ở đây. đáng trí quá đi mất

n=n/10;

sửa lại thế này là ok
n/=2; em có góp ý thế này, bác thấy thế nào

void doi10qua2(int n)
{
int a[10],i;
for(i=0;i<8;i++) a[i]=0; // sau khi chạy xong i=8; nhị phân biểu diễn ở 8 bit là ok rùi.
// i=9; không cần gán lại vì lúc này i=8
while (n!=0&&i>=0)
{
a[--i]=n%2; // cho i chạy từ 7 về 0;
n=n/2;
}
for(i=0;i<8;i++)cout< }

anh thấy thế nào đc ko>?


quangnhut123

26-02-2011, 07:22 PM

Thấy anh em thắc mắc cái dùng stack để đổi nhị phân em mạo muội đưa ra code cùi hjc mới học nhưng cũng viết vài dòng !

#include "stdafx.h"
#include
#include
struct NODE
{
int Key;
NODE *pNext;
};
NODE* CreateNode(int Data)
{
NODE* pNode;
pNode = new NODE;
if (pNode == NULL)
return NULL;
pNode->Key = Data;
pNode->pNext = NULL;
return pNode;
}
NODE* RemoveHead(NODE* &pHead)
{
if(pHead == NULL)
return NULL;
NODE* pResult = pHead;
pHead = pHead->pNext;
return pResult;
}
bool Convert2Binary(NODE* &pHead, int Data)
{
NODE *pNode;
if(Data<0)
Data=abs(Data);
while(Data != 0)
{
pNode = CreateNode(Data%2);
Data=Data/2;

if (pNode == NULL)
return false;
if (pHead == NULL)
{
pHead = pNode;
}
else
{
pNode->pNext = pHead;
pHead = pNode;
}
}
return true;
}

bool PushStack(NODE* &pStack, int Data)
{
return Convert2Binary(pStack, Data);
}
NODE* PopStack(NODE* &pStack)
{
return RemoveHead(pStack);
}

void main()
{
NODE* pStack = NULL;
NODE* pQueue = NULL;

int a;
printf("Nhap vao so thap phan n : ");
scanf("%d",&a);
PushStack(pStack, a);

printf("So nhi phan la : ");

int n =1;
while(n!=0)
{
NODE* pNode1 = PopStack(pStack);
if(pNode1 == NULL)
{
n=0;
}
else if(pNode1 != NULL)
{
printf("%d ", pNode1->Key);
}
}
printf("\n");
}


dai_k_vodanh

27-02-2011, 03:06 PM

Code của Vô Danh đơn giản dễ hiểu nè, bạn xem qua thử nhé.
Chuyển đổi số nhập vào ở hệ số 10 , sang các hệ số (2,8,16) (1 hàm giải quyết đươc tất cả ^^)

void chuyendoi(int n, int heso)
{
char i ;
stack (s);
createstack(s);
char hex[16] = {'0','1','2','3','4','5','6','7','8','9','A','B',' C','D','E','F'} ;
while (n>0)
{
i= n % heso ;
push (s,hex[i]);
n = n / heso ;
}
while (!emptystack(s)) // nếu stack ko rổng
{
pop (s,i);
cout< }
}
void main()
{
int n,heso ;
cout<<" Nhập số : "; cin>>n;
cout<<"/n Đổi sang hệ số : "; cin>>heso;
cout<<"/n Kết quả = ";
chuyendoi(n,heso);

}
================================================== ===========
// Các khai báo và các hàm hổ trợ
---Nhớ include các thư viên cơ bản---
typedef char elem; // khai báo kiểu char = kiểu elem ,mà kiểu elem trong các bài học trước khai báo = int
void chuyendoi(int n, int heso); // khai báo này để trên cùng

typedef struct nodet // định nghĩa node
{ elem data ;
struct nodet *next ; }node;
}
typedef node *stack; // định nghĩa stack

void createstack (stack &s) // hàm khởi tạo stack
{ s== null ; }

int emptystack (stack s) // hàm kiểm tra stack rổng
{ return s==null ; }

void push (stack &s , elem &x) // hàm thêm phần tử vào stack
{
stack newp = new node ;
memcpy (&newp->data, &x , sizeof(elem));
newp->next = s;
s= newp;
}

void pop (stack & s , elem & x) // hàm lấy phần tử ra khỏi stack
{
stack t = s;
if (t == null) exit (0);
memcpy (&x , &t->data , sizeof(elem)) ;
s= s>next;
delete t;
}


fithou91192

09-03-2011, 11:56 AM

Giải quyết trọn vẹn và tổng quát là chuyển một số (hệ 10) sang một hệ cơ số bất kỳ:

#include
#include

void Chuyen_10_K(unsigned n,unsigned k)
{
if (n>=k)
Chuyen_10_K(n/k,k);
printf("%c",(n%k)["0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"]);
}

int main()
{
unsigned n,k;
printf("Nhap vao so can chuyen: ");
scanf("%d",&n);
printf("Nhap vao co so can doi sang: ");
scanf("%d",&k);
printf("So %d sau khi chuyen sang co so %d la: ",n,k);
Chuyen_10_K(n,k);
getch();
return 0;
}

Chú ý: Code trên chỉ chuyển sang hệ cơ số không quá 36.
cái này có phải là đệ qui không vậy bạn (:-)?


xuyenit55

09-03-2011, 11:59 AM

cái này có phải là đệ qui không vậy bạn (:-)?

đúng rồi , cáii này dùng đệ quy !:(|


nhjthjeugja_93

29-02-2012, 10:48 PM

còn thập lục phân sang thập phân sao mấy anh chị


conrongchautien

29-02-2012, 11:11 PM

#include
#include
long hextodec(char *hex)
{
long dec = 0;
while(*hex)
{
dec*= 16;
*hex>='a'? dec+=*hex-87: dec+=*hex-'0';
hex++;
}
return dec;
}
void main()
{
char s[10] = "7ff3";
printf("%ld",hextodec(s));
getch();
}


vBulletin® Version 4.2.2, Copyright © 2022 vBulletin Solutions, Inc. All rights reserved. Administer by Kevin Hoang