KIỂU DỮ LIỆU SỐ NGUYÊN
TRONG NGÔN NGỮ LẬP TRÌNH PASCAL
I / Loại: Thường dùng 5 loại chính :
-
T/T
|
Tên
|
Miền giá trị
|
Kích thước
|
1
|
Byte
|
0..255
|
1 Byte
|
2
|
ShortInt
|
-128 .. 127
|
1 Byte
|
3
|
Interger
|
-32768 .. 32767
|
2 Byte
|
4
|
Word
|
0 .. 65535
|
2 Byte
|
5
|
LongInt
|
-2147483648..2147483647
|
4 Byte
|
II / Các cách biểu diễn số nguyên:
1 - Dạng thập phân : Dùng các kí tự ‘0’ .. ‘9’
2 - Dạng nhị phân : Dùng 2 kí tự ‘0’ và ’1’
3 - Dạng Hecxa : Dùng các kí tự ‘0’,..’9’, và các chữ ‘A’,’B’,..,’F’
4 - Dạng cơ số n : Dùng n kí tự là ‘0’,..,’9’,’A’,..’F’,...,’Z’,...
Thí dụ :
5 = 1*2 2 + 0*2 1 + 1+ 2 0 5 trong hệ nhị phân là : 101
15 = 1*2 3 +1*2 2 + 1*2 1 + 1+ 2 0 15 trong hệ nhị phân là : 11111
150 = 1*2 7 +1*2 4 + 1*2 2 + 1+ 2 1 150 trong hệ nhị phân là : 10010110
150= 9*16 1 + 6*16 0 150 trong hệ Hecxa là 96
255=15*16 1 + 15*16 0 255 trong hệ Hecxa là FF
Lưu ý : Nếu có x = 0111000011011001 ( Dạng nhị phân )thì kể từ phải qua trái ta nói :
Bít 0 của x là 1
Bít 1 của x là 0
Bít 2 của x là 0
Bít 3 của x là 1
..........................
Bít 15 của x là 0 ( Bít bêntrái nhất )
Thực hành : Muốn chuyển một số x ( Thí dụ nguyên dương kiểu Integer, ở dạng thập phân ) sang dạng n-phân ta tiến hành như sau :
Biểu diễn x dưới dạng :
x= a 15 * N 15 + a 14 * N 14 + .. + a 3 * N 3 + a 2 * N 2 + a 1 * N 1 + a 0 * N 0
Khi đó dạng N-phân của x là :
a15 a14 a13 ... a3 a2 a1 a0 .
Một trong nhiều phương pháp tiến hành là sơ đồ sau đây :
x N
a0 T1 N
a1 T2 N
a2 ........... T3 N
......
a i-3 T i-2 N
a i-2 T i-1 N
a i-1 T i N
a i 0
Trong hệ N- phân x được biểu diễn là ai a i-1 ai-2 .....a2 a1a0
150 2
0 75 2
1 37 2
1 18 2
0 9 2
1 4 2
0 2 2
0 1 2
1 0
Số x trong hệ nhị phân được biểu diễn là 10010110 ( Gồm các số dư lấy theo thứ tự ngược từ dưới lên )
III / Các phép toán với số nguyên:
1 ) Các phép toán cộng,trừ,nhân,div( lấy thương nguyên ) ,mod ( lấy dư ). Cho kết quả là số nguyên .
2 ) Phép chia ( / ) cho kết quả là số thực . Thí dụ : 10/ 2 là giá trị kiểu thực
3 ) Phép so sánh 2 số : lớn hơn ( > ) , nhỏ hơn ( < ) , không lớn hơn ( <= ) , không nhỏ hơn ( >= ) , bằng nhau ( = ) và không bằng nhau ( <> )
4 ) Phép nhân số nguyên dương x với luỹ thừa bậc N của 2 : x SHL N
5 ) Phép chia số nguyên dương x choluỹ thừa bậc N của 2 : x SHR N
6 ) Các phép toán xử lý trên các Bits của 2 số nguyên dương :
AND : 1 and 1 = 1 0 and 1 = 0 1 and 0 = 0 0 and 0 = 0
OR : 1 or 1 = 1 0 or 1 = 1 1 or 0 = 1 0 or 0 = 0
XOR : 1 xor 1 = 0 0 xor 1 = 1 1 xor 0 = 1 0 xor 0 = 0
NOT : Not 1 = 0 Not 0 = 1
Thí dụ :
x := 5 ; { 0101 }
y := 12; { 1100 }
___________________
x and y sẽ bằng 4 { 0100 }
x or y sẽ bằng 13 { 1101 }
x xor y sẽ bằng 9 { 1001 }
6 ) Phép Not trên số nguyên :
Not x = - ( X+1)
Thí dụ Not 5 = - 6
Từ đây suy ra định nghĩa số đối của số nguyên dương :
- x = ( Not x ) + 1
Vì thế trong hệ nhị phân người ta qui định nếu số x ( kiểu Integer ) có bit 15 bằng 1 thì x là số âm , ngược lại bít 15 bằng 0 thì x là số dương.
Cho x=5 { x = 0000000000000101 }
Ta có
Not x = 1111111111111010
1 = 0000000000000001
-----------------------------------------------------
- x = (Not x) +1 = 1111111111111011
Ta thử kiểm tra x + (-x) có bằng 0 hay không ?
x = 0000000000000101
-x = 1111111111111011
-------------------------------------
x + (-x) = 0000000000000000
Vậy định nghĩa số đối của x như trên không dẫn đến điều vô lý !
Vài nhận xét đặc biệt
1 ) X OR X = X
2 ) X XOR X = 0
3 ) Nếu X AND (1 SHL k ) = 1 SHL k thì Bít k của X là 1, ngược lại bít này bằng 0
IV /Một số hàm với đối số nguyên
1) Random(N) Cho kết quả là số nguyên ngẫu nhiên trong đoạn [0,N-1]
Trước khi gọi hàm này , cần gọi thủ tục khởi động bộ tạo số ngẫu nhiên : Randomize;
2) Odd(N) Cho kết quả kiểu Boolean . Nếu Odd(N) bằng True thì N là số lẻ , ngược lại N là số chẵn .
3) Abs(N) Cho trị tuyệt đối của số nguyên N .
V / Một vài bài toán mẫu:
Bài 1: Cho số nguyên dương x dạng thập phân , hãy đổi sang dạng nhị phân .
Bài 2: Cho số nguyên dương x dạng thập phân , hãy đổi sang dạng Hecxa .
Giải bài 1:
Cách 1 :
Uses Crt;
Var x : integer;
B : Array[1..16] of Integer;
Procedure Taonhiphan( x : Integer);
Var k : Integer;
Begin
FillChar(B,Sizeof(B),0);
k := 0;
While x>0 do
Begin
Inc(k);
B[k] := x mod 2;
x := x div 2;
End;
For k := 16 downto 1 do Write(B[k]);
Writeln;
End;
BEGIN
Clrscr;
For x := 1 to MaxInt do Taonhiphan(x);
Readln
END.
Cách 2 : Lập bảng phương án các luỹ thừa của cơ số N
Uses Crt;
Const A : Array[1..16] of LongInt=(1,2,4,8,16,32,64,128,256,512,1024,
2048,4096,8192,16384,MaxInt+1);
Var x : Integer;
k : Byte;
Procedure Taonhiphan(x : Integer);
Begin
k := 15;
While (x>0) do
Begin
While A[k]>x do
Begin
Write('0');
Dec(k);
End;
Write('1');
x := x-A[k];
Dec(k);
End;
While k>0 do
Begin
Write('0');
Dec(k);
End;
Writeln;
End;
BEGIN
Clrscr;
For x:= 1 to MaxInt do Taonhiphan(x);
Readln
END.
Cách 3 Lấy giá trị của x từ các ô nhớ , hiện lên màn hình
Uses Crt;
Var x : Integer;
Procedure Taonhiphan(x : Integer);
Var k : Byte;
Begin
For k:=15 downto 0 do
If (x and ( 1 Shl k))= (1 Shl k) then Write('1') Else Write('0');
Writeln;
End;
BEGIN
Clrscr;
For x:=1 to MaxInt do Taonhiphan(x);
Readln
END.
Giải bài 2:
Cách 1 : Lập bảng giá trị các luỹ thừa của cơ số 16
Uses Crt;
Const A : Array[0..3] of LongInt=(1,16,256,4096);
B : Array[1..15] of Char=('1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
Var x : LongInt;
k : Integer;
Procedure TaoHecxa(x : LongInt);
Var p : Byte;
Begin
k := 3;
While (x>0) do
Begin
While A[k]>x do Begin Write('0'); Dec(k);End;
If k>=0 then
Begin
p := x div A[k];
Write(B[p]);
x := x-p*A[k];
Dec(k);
End;
End;
While (k>=0) do Begin Write('0'); Dec(k);End;
Writeln;
End;
BEGIN
Clrscr;
x := 90000;
TaoHecxa(x);
Readln
END.
Cách 2 : Dựa vào các hàm xử lý Byte
Uses Crt;
Const A : Array[0..15] of char ='0123456789ABCDEF';
Var x : Integer;
Procedure He16(x:Integer);
Begin
Write(x,': ','$');
Write(A[Hi(x) shr 4]);
Write(A[(Hi(x) and $F)]);
Write(A[Lo(x) shr 4]);
Write(A[(Lo(x) and $F)]);
Writeln;
End;
BEGIN
Clrscr;
For x:=0 to MaxInt do He16(x);
Readln;
END.
Chia sẻ với bạn bè của bạn: |