PDA

View Full Version : Đổi từ hệ cơ số 10 sang ..



cashier
23-12-2007, 11:48
Hôm nay mới học về xử lí bít . Có một bài tập là đổi một số từ hệ cơ số 10 sang hệ cơ số 8, mình đã làm theo thuật toán nhưng chẳng hiểu sao lại ra không đúng :no: Bạn nào biết mình sai chỗ nào thì chỉ giáo hộ nha :
Thuật toán là ta cắt từng nhóm 3 số ( từ phải qua trái) của các bit ( do 1 số khi đưa vào máy xử lí đã được mã hoá dưới dạng nhị phân - lưu trong 8 bít của 1 byte - đối với kiểu byte hoặc 16 bit đối với kiểu word ... )
Với mỗi số ta đổi sang hệ cơ số 10 Và viết lần lượt
VD 11 = 00001011 ( đối với kiểu byte)
b1 : ta tách thành 00 001 011
b2 : ta chuyển 00 =0; 001 =1 ; 011 = 3
Vậy số 11 trong hệ bát phân là 013 hay viết là 13

Sau đây là code của mình :


Function GetNum(x:word;i,j:byte):word;
Var k:byte;
Begin
k:=(sizeof(x) shl 3)-1-j;
getnum:=x shl k shr i;
End;
Procedure Xprint(x:word);
Var k:word;
i:integer;
Begin
i:=(sizeof(x) shl 3) -1;
k:=i mod 3;
Write(Getnum(x,i,i+k));
i:=i-k-1;
While i>=2 do
begin
Write(Getnum(x,i,i-2));
i:=i-3;
End;
Procedure Test;
Var x:word;
Begin
Write('Nhap so ban muon doi : ');Readln(x);
Write(' ');Xprint(x);
Readln;
End;

BEGIN
Test;
End.


Vậy mà chẳng hiểu sao khi chạy với tất cả các số đều sai
Ví dụ như với x = 11 thì nó chẳng ra 13 mà lại ra là 002 :emlaugh:


Làm ơn chỉ dùm mình với :helpsmili

bete
23-12-2007, 13:20
Thân gửi bạn cashier,

Tui có chút ý kiến: debug là 1 kỹ năng cần nên có của dân lập trình
Chương trình của cashier là khá ngắn => bạn nên lợi dụng cơ hôi này để tập debug
Các IDE thường có chức năng cho debug (goto cursor, step in, step over, watch, .....)
Nếu mình không xài IDE thì có thể chèn các lịnh in (print) vô chương trình
Ví dụ:


Function GetNum(x:word;i,j:byte):word;
Var k:byte;
Begin
k:=(sizeof(x) shl 3)-1-j;
getnum:=x shl k shr i;
in ra đại khái: Đây là hàm GetNum: x=..., i=..., j=... => k=...., trả về: .....
End;


(có gì sai sót mong được góp ý; xin cám ơn)

-thân

cashier
23-12-2007, 13:51
T__T
Cái đó là em post code nhầm . ( Không phải chỗ em đang thắc mắc đâu ạ :( )
Theo thuật toán là đầu tiên dịch sang trái k bít sau đó lại dịch sang phải k bit và cuối cùng dịch sang phải i bít
tức là sửa thành :


Function GetNum(x,j,i:byte):word;
Var k:byte;
Begin
k:=(sizeof(x) shl 3)-1-j;
getnum:=((x shl k) shr k) shr i;
End;


Đây là hàm GetNum: trả về: số ( đã đổi ra cơ số 10) của 1 số nhị phân ( sau khi đã chuyển từ cơ số 10 - máy tự chuyển ) từ bit thứ j đến bit thứ i
VD với x=11 thì chuyển sang
là 00 001 011
các bít được đánh dấu lần lượt là 7 6 5 4 3 2 1 0

=> getnum (11,2,0) = 3 ( vì ra = 011 )

Nhưng mà không hiểu sao cô giáo nói là nó đưa ra luôn số biểu diễn dưới dạng cơ số 10 nhưng mà nó lại đưa ra số biểu diễn dưới dạng cơ số 2 :no:

Anh giải thích dùm em được không ạ ?

bete
23-12-2007, 16:17
Thân gửi bạn cashier,

Tui nghĩ là:

1) Trước hết bạn thử coi bạn chia nhóm có đúng hay không : debug bằng cách chèn thêm 1 số lịnh print:



Procedure Xprint(x:word);
Var k:word;
i:integer;
Begin
i:=(sizeof(x) shl 3) -1;
k:=i mod 3;
In ra i, i+k và Getnum(x,i,i+k)
i:=i-k-1;
While i>=2 do
begin
In ra i, i-2 và Getnum(x,i,i-2);
i:=i-3;
End;
end;


2) Nếu bạn thấy là bạn chia nhóm đúng thì bạn debug GetNum kế tiếp


Nhưng mà không hiểu sao cô giáo nói là nó đưa ra luôn số biểu diễn dưới dạng cơ số 10 nhưng mà nó lại đưa ra số biểu diễn dưới dạng cơ số 2
Anh giải thích dùm em được không ạ ?
=> tui không rõ chỗ bạn đang thắc mắc nào cho lắm !

(có gì sai sót mong được góp ý; xin cám ơn)

-thân

cashier
23-12-2007, 20:12
:bawling:
Hôm nay tự nhiên người rất dơ hơi không chấp nhận được :no:
Quên mất một điều hết sức quan trọng là TP nhà mình bị lỗi chưa thay thành ra đi tin tưởng vào :banghead:

Bài đấy chạy hoàn toàn đúng ( trên các máy khác ) đối với máy của em TP không làm việc trực tiếp trên bit được nên ra kết quả sai :( Xin lỗi vì đã làm phiền mọi người !

Àh mà tiện thể post luôn code, (code này chắc chắn đúng - có ai ra sai thì kiểm tra lại TP nhá :D )


uses CRT;
{------------------------------------------}
Function GetNum(x,j,i:word):word;
Var k:word;
Begin
k:=(sizeof(x) SHL 3) -j-1;
GetNum:= (( x SHL k) SHR k) SHR i;
End;{----------------------------------------}
procedure XPrint(x:word);
var i:integer;
k:word;
begin
i:=sizeof(x) SHL 3 - 1 ;
k:=i mod 3;
write(GetNum(x,i,i-k));
i:=i-k-1;
while i>=2 do
begin
write(getnum(x,i,i-2));
i:=i-3;
end;
writeln;
end;
{-----------------------------------------}
Procedure Test;
Var x:word;
Begin
Clrscr;
Write('Nhap so ban muon doi : ');Readln(x);
Write(' ');Xprint(x);
Readln;
End;
{-----------------------------------------}
BEGIN
Test;
End.