Dữ liệu kiểu số nguyên
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
Lu ý : 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à :
a
15
a
14
a
13
... a
3
a
2
a
1
a
0 .
Một trong nhiều phơng pháp tiến hành là sơ đồ sau đây :
___________________
Dữ liệu kiểu số nguyên
x N
a
0
T
1
N
a
1
T
2
N
a
2 ...........
T
3
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µ a
i
a
i-1
a
i-2
.....a
2
a
1
a
0
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 )
___________________
D÷ liÖu kiÓu sè nguyª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
-------------------------------------
___________________
Dữ liệu kiểu số nguyên
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.
___________________
Dữ liệu kiểu số nguyên
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.
___________________
Dữ liệu kiểu số nguyên
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);
___________________
Dữ liệu kiểu số nguyên