PDA

View Full Version : Chuyển hệ 10 sang hệ 2 trong lập trình C



neverland87
01-02-2007, 10:45 AM
Mình giải giúp bạn bài chuyển từ hệ 10 sang hệ 2 nhé, chuyển ngược lại thì bạn tự làm, bài dưới đây mình dùng stack để giải:

#define max 100 // khai báo kích thước tối đa của stack
int stack[max];
int top=-1 //Khởi tạo stack rỗng
void Push(int stack,int &top,int x) // đẩy phần tử vào stack
{
if (top==max-1)
{
puts("Stack da day");
exit(1);
}
else
{
top++;
stack[top]=x;
}
}
int Pop(int stack,int &top) // đẩy phần tử khỏi stack
{
int tam;
if (top==-1) return top;
else
{
tam=stack[top];
top--;
return tam;
}
}

void Dec2Bin(int n) // n là số cần chuyển đổi đó
{
int thuong,du;
thuong=n;
while (thuong!=0)
{
du=thuong%2;
push(stack,top,du);
thuong=thuong/2;
}
printf("So nhi phan la:");
while (top!=-1) printf("%d",pop(stack,top));
}

huynguyen
01-02-2007, 12:03 PM
Bài làm = stack khá tốt nhưng dài dòng, dùng đệ quy sẽ hiệu quả hơn

#include <iostream>
using namespace std;
void dectobin(int n){
if (n > 0){
dectobin(n/2);
cout <<n%2;
}
}
int main(){
cout <<"Nhap n: "; int n; cin >>n;
cout <<"Chuyen co so: "; dectobin(n);
cout <<endl; system("pause");
return 0;
}
Còn việc chuyển ngược lại thì cũng đơn giản

#include <iostream>
using namespace std;
int bintodec(int n){
int s = 0; int pow;
for (int i = 0;n > 0;++i){
pow = 1;
for (int j = 0;j < i;++j) pow *= 2;
s += pow*(n%10);
n /= 10;
}
return s;
}
int main(){
cout <<"Nhap n: "; int n; cin >>n;
cout <<"Chuyen co so: " <<bintodec(n) <<endl;
system("pause");
return 0;
}
Bạn nên nhớ đây là code xét trên trường hợp số nhập vào là đúng, nếu bạn làm 1 chương trình lớn thì phải có các bước kiểm tra dữ liệu nhập vào, nếu ko, chương trình của bạn sẽ chạy sai.
Bài tập này cực dễ cho những người thích tìm hiểu nhưng lại cực khó cho những người lười tìm hiểu, ngại viết code, ko thích học lập trình và vô cùng lười biếng :D

shinichi_haha
01-02-2007, 08:35 PM
Tiện thể mình đố các cậu bài này nha.
Viết đúng 1 hàm duy nhất thể hiện dạng nhị phân của các số nguyên 1 byte 2 byte 4 byte số thực 2byte số thực 4 byte và một kiểu dữ liệu trừu tượng bất kỳ.

huynguyen
01-02-2007, 09:20 PM
Hình như là trong C++ có class liên quan đến nhị phân hay là có hàm nào đấy, ko nhớ rõ lắm, cái này thì chịu, đợi người đố giải đố thoai.

neverland87
02-02-2007, 08:55 AM
Tiện thể mình đố các cậu bài này nha.
Viết đúng 1 hàm duy nhất thể hiện dạng nhị phân của các số nguyên 1 byte 2 byte 4 byte số thực 2byte số thực 4 byte và một kiểu dữ liệu trừu tượng bất kỳ.
neverland dùng phép toán & và >> để làm bài này, không biết anh bạn có cho là đúng không nữa?
void main() // đổi hệ 10 --> 2
{
nhập số thập phân n();
for(i=7;i>=0;i--) //i đi từ 7->0 nghĩa là số này sẽ biểu diễn số np 8 bit
printf("%d",(n>>i)&1)
}

hi hi,mình nghĩ chắc để người ra câu đố giải dùm thôi

huynguyen
02-02-2007, 09:15 AM
Đúng rồi, quên mất là cái toán tử dịch chuyển bit :D

TMTVhero
30-01-2008, 09:07 PM
neverland dùng phép toán & và >> để làm bài này, không biết anh bạn có cho là đúng không nữa?
void main() // đổi hệ 10 --> 2
{
nhập số thập phân n();
for(i=7;i>=0;i--) //i đi từ 7->0 nghĩa là số này sẽ biểu diễn số np 8 bit
printf("%d",(n>>i)&1)
}

hi hi,mình nghĩ chắc để người ra câu đố giải dùm thôi

mình là newbie chỉ mới học lập trình đc vài tháng thui(đến h khoảng 2 tháng),mấy hum trc thầy cũng có cho cái đề chuyển sang nhị phân như trên.lúc đó mình tìm trên mạng cũng thấy cái code(ngắn gọn) y như vậy nhưng ko hỉu gì hết
mong các bạn nói rõ hơn về thuật chuyển bít hay dời bít gì gì đó (:=(|)
"printf("%d",(n>>i)&1)" ==>cái này ý nghĩa là gì vậy các bạn (:-O)

sieuphuong
30-01-2008, 09:23 PM
printf("%d",(n>>i)&1)

>> là phép dịch phải bit đó bạn . Còn << là phép dịch trái bit . Bạn hiểu như vậy nhe :

Nếu viết 20<<3 = 20*(2^3)

Nếu viết 20>>3 = 20/(2^3)

Dấu & ở đây là phép AND bit . Ví dụ :

111 &
010
kq 010

º┴¶† HACK †¶┴º
31-01-2008, 12:09 AM
hix, mình cũng kô được học về cái bit này, bạn có thể nói cụ thể (hoặc có code nào dễ dễ tí) cho mình xem cái dạng nó làm sao kô
Ví dụ như bài của bạn: 111&010=010 thì người dùng sẽ nhập vào 2 số dạng nhị phân rồi & nó ---> kq là 1 số nhị phân. Bạn có thể code bài này được kô (Mình kô biết "khai biến" kiểu gì cả).Thanks
bạn nhiều

ủa, cái đề tài này được post gần 1 năm rồi à :| (diễn đàn này chất lượng wa' :))

trinitrotoluen
31-01-2008, 07:58 PM
vd bạn code
printf ("%d",6&2);
thì nó sẽ xuất ra 2 vì :

110 -> số 6
010 -> số 2
---
010 -> số 2

danhdaidao
02-09-2009, 02:07 PM
giúp mình với, mình mới học C++ mà thầy cho bài tập là :
Viết chương trình đổi một số nguyên từ hệ 10 sang hệ 2 (mình mới học có 2 hàm là printf và scanf thui)
giúp mình viết chương trình với 2 hàm đó để giải toán với các bạn ơi :(| :(| :(|

trungkien45
02-09-2009, 02:23 PM
Chắc bạn biết dùng mảng?
Lưu các số dư cho 2 rồi lưu vào mảng, duyệt mảng từ cuối.
Mệt

nth4
02-09-2009, 03:29 PM
viết bằng C#, bạn đổi qua C++ nha, cũng giống nhau ah, ko có khác gì đâu.



static void Main(string[] args)
{
string answer = "N";
do
{
int i = 0;
string chuoiNhap = "";

str = "";
Console.Write("Nhap so thap phan can doi sang nhi phan: ");
chuoiNhap = Console.ReadLine();

while (!KiemTraNhapSo(chuoiNhap))
{
Console.WriteLine("Ban hay nhap dung kieu so thap phan.");
Console.WriteLine();
Console.Write("Nhap so thap phan can doi sang nhi phan: ");
chuoiNhap = Console.ReadLine();
}

i = int.Parse(chuoiNhap);
GetMod(i);

Console.WriteLine("So nhi phan cua " + i.ToString() + " la so: " + DaoNguoc(str));
Console.Write("Ban co muon tiep tuc ko? (Y?N)");

answer = Console.ReadLine().ToUpper();
Console.WriteLine();
}
while (answer == "Y");
}

static bool KiemTraNhapSo(string chuoiNhap)
{
try
{
int.Parse(chuoiNhap);
}
catch
{
return false;
}

return true;
}

static string str = "";
static string GetMod(int i)
{
int x = 0;

str += i % 2;
x = i / 2;
if (x == 0)
return str;

return GetMod(x);
}

static string DaoNguoc(string chuoi)
{
string chuoiDao = "";
int l = 0;

for (l = chuoi.Length - 1; l >= 0; l--)
{
chuoiDao += chuoi[l].ToString();
}

return chuoiDao;
}

danhdaidao
02-09-2009, 04:50 PM
Chắc bạn biết dùng mảng?
Lưu các số dư cho 2 rồi lưu vào mảng, duyệt mảng từ cuối.
Mệt

Mình chưa học tới phần mảng, nên mình ko biết, bạn ơi với 2 hàm printf và scanf bạn có thể hướng dẫn cụ thể cho mình cách giải từ hệ 10 chuyển sang hệ 2 được ko. Mình cám ơn trước nha .....!

trungkien45
02-09-2009, 05:49 PM
Về cơ bản thì dùng printf() thì chuyển đổi qua lại các hệ 10, 16, 8 được, nhưng không có hệ 2.
Vì vậy mình không hiểu ý của bài là gì.

trinitrotoluen
02-09-2009, 06:23 PM
Chỉ với printf và scanf thì chắc thầy bạn cũng chỉ yêu cầu bạn chuyển kiểu số int thôi phải ko ?



void dectobin(int num)
{
bool f=0;
for (int i=31;i>=0;--i)
{
if (f==0&&((num>>i)&1))
{
f = 1;
}
if (f)
{
printf("%d",(num>>i)&1);
}
}
}


edit : Nếu cho dùng thêm lệnh sizeof thì chính xác hơn chứ bây h mình cho mặc định kiểu int là 4 bytes luôn rồi (32 bits). Có trình dịch nó tính int là 2 bytes thôi.

danhdaidao
02-09-2009, 06:29 PM
cám ơn các bạn rất nhiều

kangoo1707
13-09-2009, 05:42 PM
Tiện thể mình đố các cậu bài này nha.
Viết đúng 1 hàm duy nhất thể hiện dạng nhị phân của các số nguyên 1 byte 2 byte 4 byte số thực 2byte số thực 4 byte và một kiểu dữ liệu trừu tượng bất kỳ.

Tôi đang tự hỏi kiểu số thực và kiểu bất kỳ làm sao có thể shift đây

Đây là 1 hàm ngắn gọn về việc chuyển int sang bit


void int2bit(int num) {
for(int i = 7; i > -1; i--)
printf("%d", (num & 1 << i ) > 0 ? 1 : 0);
}

k_y_1989
17-01-2010, 02:23 PM
Xin cho tiểu đệ đóng góp vài ý kiến nhá

void int2bit(int num)
{
for(int i = 7; i > -1; i--)
printf("%d", (num & 1 << i ) > 0 ? 1 : 0);
}
code rất hay, hay nhất trong topic này nhưng nếu người nào mất căn bản phần nhập môn đặc biệt là về các toán tử trên bít thì potay.com (giống như đệ ôn lại 1 tiếng đồng hồ mới thông được)
==>Mạng phép chỉnh lại đoạn code của huynh cho dễ hiểu nha


void int2bit(int num)
{

for(int i = 7; i >= 0; i--)
{
//printf("%d", (num & 1 << i ) > 0 ? 1 : 0);
if( ( num & (1 << i) ) >0 )
printf("1");
else
printf("0");

}

}

int main(int argc, char* argv[])
{
int ia;
printf("nhap vao mot so nguyen ");
scanf("%d",&ia);
int2bit(ia);
getch();
return 0;
}

còn chỉ học printf và scanf như bạn danhdaidao thì hơi khó ah , không bít có cách nào ko ??
ở đây đệ cũng viết nhưng phải biết thêm cỏn trỏ và mãng nữa nhưng mà mới học printf và scanf thì sao bít con trỏ và mảng nhỉ khó hiều quá ??


#include "stdio.h"
#include "conio.h"
#include "stdlib.h"


int main(int argc, char* argv[])
{
int ia,idv,i=7;
int *a=(int *)malloc(7*sizeof(int));
printf("Nhap vao mot so nguyen ");
scanf("%d",&ia);
while(ia>0)
{
idv=ia%2;
a[i]=idv;
i--;
ia=ia/2;
}
for(int j=0;j<=7;j++)
{
if(a[j]<0)
a[j]=0;
printf("%d",a[j]);
}
free(a);
getch();
return 0;
}

quanghoa
17-01-2010, 07:57 PM
giúp mình với, mình mới học C++ mà thầy cho bài tập là :
Viết chương trình đổi một số nguyên từ hệ 10 sang hệ 2 (mình mới học có 2 hàm là printf và scanf thui)
giúp mình viết chương trình với 2 hàm đó để giải toán với các bạn ơi :(| :(| :(|

Bạn tham khảo chương trình mình viết, bạn chỉ cần biết thêm vòng while, phép nhân, chia, chia lấy dư thôi. Bạn muốn in ra các hệ số khác, chỉ cần thay số 2 ở dòng thứ 3 đó. Ví dụ muốn in ở hệ 8 thì sửa #define coso 2 thành #define coso 8 là được


#include<conio.h>
#include<stdio.h>
#define coso 2
void main(){
int i,k=1,n;
/*Nhap n*/
printf(" n = ");
scanf("%d",&n);
/*Tim k la so dang coso^x gan bang n*/
while(coso*k<=n)k=k*coso;
/*In ra*/
printf(" In nhi phan la ");
while(k>0){
printf("%d",n/k);
if(n>=k)n=n%k;
k=k/coso;
}
getch();
}

chuong01
17-01-2010, 08:39 PM
Đây là đoạn code chú giải cách thuật toán chạy :D


#include <stdio.h>
#define coso 2
void main() {
int i, k, n; int a[100]; i = 0; k = 1;
/*Nhap n*/
printf (" n = \n"); scanf ("%d",&n);
/*Tim k la so dang coso^x gan bang n*/
while (coso*k <= n)
k = k*coso;
printf ("k = %d \n", k);
while (k > 0) {
printf ("n = %d, k = %d, n/k = %d \n", n, k, n/k);
printf ("a[%d] = n/k = %d \n", i, n/k);
printf ("k = k/coso = %d \n", k/coso);
a[i] = n/k; i++;
if (n >= k) {
printf ("if (n = %d >= k = %d) n = n mod k = %d \n", n, k, n%k);
n = n%k; }
k = k/coso;
} n = i;
printf ("\n So nhi phan la \n");
for (i = 0; i < n; i++)
printf ("%d ", a[i]);
printf ("\n");
}

quanghoa
18-01-2010, 10:00 PM
Đây là đoạn code chú giải cách thuật toán chạy :D


#include <stdio.h>
#define coso 2
void main() {
int i, k, n; int a[100]; i = 0; k = 1;
/*Nhap n*/
printf (" n = \n"); scanf ("%d",&n);
/*Tim k la so dang coso^x gan bang n*/
while (coso*k <= n)
k = k*coso;
printf ("k = %d \n", k);
while (k > 0) {
printf ("n = %d, k = %d, n/k = %d \n", n, k, n/k);
printf ("a[%d] = n/k = %d \n", i, n/k);
printf ("k = k/coso = %d \n", k/coso);
a[i] = n/k; i++;
if (n >= k) {
printf ("if (n = %d >= k = %d) n = n mod k = %d \n", n, k, n%k);
n = n%k; }
k = k/coso;
} n = i;
printf ("\n So nhi phan la \n");
for (i = 0; i < n; i++)
printf ("%d ", a[i]);
printf ("\n");
}


Bài mình vậy rồi không biết còn chỉnh sửa để làm gì. Tự dưng thêm một cái mảng rồi làm việc biết dùng để làm gì nửa. Nếu là để trình bày thuật giải thì không đúng rồi,

3gau
01-12-2011, 12:05 AM
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main ()
{

int r[8]={0},a,dem,b,i;
printf("nhap so a:");
scanf("%d",&a);
printf("so %d duoc doi sang he nhi phan la:\n ",a);
for ( i=0; i<7 ;i++)
{
b=a/2;
if ( a%2 ==1 )
r[i]=1;
a=b;
dem=i;
}
for ( i=dem; i>=0; i--)
printf("%8d",r[i]);
getch ();
}

boss14420
01-12-2011, 03:29 AM
Tiện thể mình đố các cậu bài này nha.
Viết đúng 1 hàm duy nhất thể hiện dạng nhị phân của các số nguyên 1 byte 2 byte 4 byte số thực 2byte số thực 4 byte và một kiểu dữ liệu trừu tượng bất kỳ.

Mặc dù câu hỏi đã 4 năm rồi nhưng vẫn chưa có ai trả lời được.
Theo mình thì để thể hiện dạng nhị phân của một kiểu dữ liệu bất kỳ (không chỉ bao gồm số nguyên) thì phải chuyển nó thành số nguyên rồi in ra biểu diễn nhị phân của nó như nhiều bạn ở đây đã làm.


template <class T> void toBinary(const T& t) {
int size = sizeof(t);
char* data = (char*)((void*)&t); // Ép kiểu con trỏ của t từ T* sang char*
for(int i = 0; i < size; ++i, ++data) {
// In biểu diễn nhị phân của *data
for(int j = 7; j >= 0; --j)
std::cout << (int)((*data >> j)&1);
std::cout << " "; // Cứ mỗi một byte lại có một khoảng trắng
}
}

Demo: https://ideone.com/h0ZKq

clchicken
01-12-2011, 10:21 AM
@ boss: Nhỡ có dấu chấm động thì làm sao mà chuyển qua số nguyên ?
Ko lẽ cắt vứt bớt phần thập phân của nó hả @@ ??

VoTichSu
01-12-2011, 10:45 AM
@clchicken:
đề bài bảo biểu diễn dạng nhị phân thì làm phương pháp dịch và and bit vậy là đúng rồi. Phần exponential và mantissa sẽ ra in hệt như chứa trong máy.

chỉ hiềm là bài trên dùng template để giải nên chỉ compile được với C++. Nếu là tôi thì tôi viết hàm nhận void pointer để có thể compile theo C.

clchicken
01-12-2011, 11:50 AM
@ VTS: E đang hỏi cái ý tưởng của bạn boss mà @@
Bạn ý bảo chuyển kiểu khác qua kiểu nguyên... nên e hơi thắc mắc. Vì chuyển kiểu nguyên sẽ bị "cụt đuôi" :D
Chứ dùng các phép trên bit thì hiệu quả rùi :D

boss14420
01-12-2011, 12:28 PM
@ VTS: E đang hỏi cái ý tưởng của bạn boss mà @@
Bạn ý bảo chuyển kiểu khác qua kiểu nguyên... nên e hơi thắc mắc. Vì chuyển kiểu nguyên sẽ bị "cụt đuôi" :D
Chứ dùng các phép trên bit thì hiệu quả rùi :D

Bạn xem lại đoạn code này:


char* data = (char*)((void*)&t);

t dù có kiểu dữ liệu như thế nào đi nữa thì biểu diễn của nó trong bộ nhớ vẫn là một dãy cái bit. Tùy vào kiểu dữ liệu đó là gì mà máy có những cách ứng xử riêng với các phép toán trên đó.

VD: Biểu diễn của f = 2.5f: 00000000 00000000 00100000 01000000
câu lệnh trên sẽ tạo ra một con trỏ data có kiểu char* trỏ đến byte đầu tiên của f.

đây chỉ là cách để ép cho máy hiểu một dãy bit (vốn để biểu diễn kiểu dữ liệu T) là để biểu diễn kiểu dữ liệu char. Ép kiểu kiểu này không hề làm suy suyển dãy bit giống như cái phép làm tròn số thông thường ( char c = (char)f);

clchicken
01-12-2011, 07:11 PM
Cái đó thì mình hiểu :D
Tại bạn bảo
Theo mình thì để thể hiện dạng nhị phân của một kiểu dữ liệu bất kỳ (không chỉ bao gồm số nguyên) thì phải chuyển nó thành số nguyên
Làm mình tưởng là cố chuyển "bọn nó" về kiểu nguyên chứ :D

nndung179
02-12-2011, 02:45 PM
#include "stdafx.h"
#include <SDKDDKVer.h>
#include <stdio.h>
#include <tchar.h>
#include <iostream>
using namespace std;

#define MAX 8

void ConvertDecToBin(int n)
{
char bit[MAX];
int temp;

for(int i = 0; i <= MAX - 1; i++)
{
temp = n % 2;
n = n / 2;

if(temp == 0)
{
bit[i] = '0';
}
else
{
if(temp == 1)
{
bit[i] = '1';
}
}
}
cout << "Binary array: ";
for(int j = MAX - 1; j >= 0; j--)
{
cout << bit[j] << " ";
}
cout << endl << endl;
}

void CovertBinToDec(char bit[MAX])
{
int sum = 0;
int dem = 0;
for(int i = MAX - 1; i >= 0; i--)
{
if(bit[i] == '1')
{
bit[i] = 1;
}
else
{
if(bit[i] == '0')
{
bit[i] = 0;
}
}
sum = sum + pow(2, (float)dem) * bit[i];
dem++;
}
cout << "Decimal: " << sum << endl;
}

int main()
{
int option;
do
{
cout << "1. Convert Decimal To Binary" << endl;
cout << "2. Convert Binary To Decimal" << endl;
cout << "3. Exit" << endl << endl;

cout << "Make a choice: ";
cin >> option;

switch(option)
{
case 1:
{
int n;
cout << "Input number: ";
cin >> n;
ConvertDecToBin(n);
}break;
case 2:
{
char bit[MAX + 1];
cout << "Input binary 8 charaters: ";
cin >> bit;
CovertBinToDec(bit);
}break;
}
}
while(option != 3);

return 0;
}


1. Chuyển đối từ thập phân sang nhị phân
2. Chuyển đổi từ nhị phân sang thập phân

Khoiceo
06-06-2013, 05:08 PM
#include"stdio.h"
#include"conio.h"
#include"iostream.h"
#include"math.h"
void main() // doi he 10 --> 2
{
clrscr();
int n,i,b;
printf("Nhap vao so nhi phan n :"); cin>>n;
printf("\nhap so bit"); cin>>b;
for(i=b;i>=0;i--)
{
if(n<pow(2,b))
printf("%d",(n>>i)&1);
}



getch();





}