I. Giới thiệu chung

Trong Toán học, hệ cơ số (hay hệ đếm) là một khối hệ thống các kí hiệu toán học và quy tắc thực hiện tập kí hiệu đó để màn trình diễn số đếm. Các kí hiệu toán học rất có thể là chữ số hoặc các kí trường đoản cú chữ cái. Buộc phải phân biệt thân Hệ cơ sốCơ số (số lượng kí hiệu sử dụng trong một hệ cơ số).

Bạn đang xem: Cơ số là gì

Có tương đối nhiều hệ cơ số không giống nhau, từng hệ cơ số bao gồm quy tắc trình diễn số không giống nhau. Các dãy kí hiệu như là nhau hoàn toàn có thể sẽ ứng với số đông số không giống nhau trong những hệ đếm khác nhau. Lấy một ví dụ trong hệ thập phân, 111111 biểu thị số "mười một", mặc dù trong hệ nhị phân, này lại thể hiện số "ba",... Số đếm nhưng mà dãy kí hiệu biểu thị được gọi là cực hiếm của nó.

Có hai nhiều loại hệ cơ số là hệ cơ số phụ thuộc vào vào vị trí với hệ cơ số không phụ thuộc vào vị trí. Chẳng hạn, hệ đếm La Mã là một trong những hệ cơ số không nhờ vào vào vị trí. Hệ đếm này gồm các kí hiệu chữ cái: I,V,X,L,C,D,M;I, V, X, L, C, D, M;I,V,X,L,C,D,M; từng kí hiệu có giá trị cố thể:

I=1,V=5,X=10,L=50,C=100,D=500,M=1000.I=1, V=5, X=10, L=50, C=100, D=500, M=1000.I=1,V=5,X=10,L=50,C=100,D=500,M=1000.

Trong hệ đếm này, giá trị của những kí hiệu không nhờ vào vào địa điểm của nó. Ví dụ, trong hai màn trình diễn IX (9)IX ext (9)IX (9) và XI (11)XI ext (11)XI (11) thì XXX đều sở hữu giá trị là 101010.

Các hệ đếm hay sử dụng là các hệ đếm phụ thuộc vị trí. Những số nguyên basebasebase ngẫu nhiên có giá trị to hơn 111 đều rất có thể được chọn làm cơ số cho 1 hệ đếm. Trong số hệ đếm các loại này, số lượng kí hiệu thực hiện sẽ chính bởi cơ số của hệ đếm đó, và cực hiếm tương ứng của các kí hiệu là: 0,1,2,...,base−10, 1, 2,..., base - 10,1,2,...,base−1. Để diễn tả một màn biểu diễn XXX là biểu diễn của số sinh hoạt hệ cơ số basebasebase, ta kí hiệu là XbaseX_baseXbase​.


II. Trình diễn số trong các hệ đếm

1. Cực hiếm của một số trong hệ cơ số bất kỳ

Trong một hệ cơ số bbb, đưa sử số NNN bao gồm biểu diễn:

dndn−1dn−2...d0,d−1d−2...d−md_nd_n-1d_n-2...d_0,d_-1d_-2...d_-mdn​dn−1​dn−2​...d0​,d−1​d−2​...d−m​

trong đó bao gồm n+1n + 1n+1 chữ số phía bên trái dấu phẩy, mmm chữ số bên đề xuất dấu phẩy trình bày cho phần nguyên và phần phân của NNN, với 0≤dib0 le d_i 0≤di​b. Khi đó giá trị của số N được xem theo công thức:

N=dnbn+dn−1bn−1+...+ d0b0+d−1b−1+d−2b−2+...+ d−mb−mN=d_nb^n+d_n-1b^n-1+...+ ext d_0b^0+d_-1b^-1+d_-2b^-2+...+ ext d_-mb^-mN=dn​bn+dn−1​bn−1+...+ d0​b0+d−1​b−1+d−2​b−2+...+ d−m​b−m

Giá trị của một số trong những trong hệ cơ số bbb cũng đó là biểu diễn tương xứng của nó sống hệ cơ số 101010.

Cài đặt chương trình tính giá chỉ trị một vài thực NNN trong hệ cơ số bbb:

void enter() getline(cin, N); // Nhập N sinh hoạt dạng xâu. Cin >> B;// Tính quý hiếm của trình diễn N vào hệ cơ số B.double get_value(string N, int B) int pos = N.find("."); // kiếm tìm vị trí vệt "." của N. // lấy phần nguyên và phần phân của N. String left_path = N.substr(0, pos), right_path = N.substr(pos + 1, N.size() - pos); // Tính quý giá từng phần, chú ý ép đẳng cấp số thực. Double value = 0, nguồn = 1; for (int i = left_path.size() - 1; i >= 0; --i) value += (double)(left_path - "0") * power; nguồn = power nguồn * (double)B; power = 1.0 / (double)B; for (int i = 0; i right_path.size(); ++i) value += (double)(right_path - "0") * power; power nguồn /= (double)B; return value;

2. Những hệ cơ số thường dùng trong Tin học

Trong Tin học, xung quanh hệ cơ số 101010, bạn ta còn sử dụng hai một số loại hệ đếm sau:

Hệ cơ số 222 (Hệ nhị phân): Chỉ sử dụng hai kí hiệu 000 với 111. Lấy ví dụ, 10112=1×20+1×21+0×22+1×23=11101011_2=1 imes 2^0 + 1 imes 2^1 + 0 imes 2^2 + 1 imes 2^3=11_1010112​=1×20+1×21+0×22+1×23=1110​.Hệ cơ số 161616 (Hệ thập lục phân giỏi hệ Hexa): Sử dụng những chữ số tự 000 cho tới 999 cùng 666 chữ cái A,B,C,D,E,F;A, B, C, D, E, F;A,B,C,D,E,F; trong những số ấy A,B,C,D,E,FA, B, C, D, E, FA,B,C,D,E,F có mức giá trị theo lần lượt là 10,11,12,13,14,1510, 11, 12, 13, 14, 1510,11,12,13,14,15. Mang ví dụ, 16A=10×160+6×161+1×162=3621016A = 10 imes 16^0+6 imes 16^1+1 imes 16^2=362_1016A=10×160+6×161+1×162=36210​.

3. Màn biểu diễn số nguyên với số thực

3.1. Màn trình diễn số nguyên

Trong Tin học, các số nguyên hoàn toàn có thể được màn biểu diễn dưới dạng có dấu hoặc không dấu. Để biểu diễn số nguyên, ta có thể chọn form size số nguyên là 111 byte, 222 byte, 444 byte$,...,2^N$ byte, mỗi bí quyết chọn sẽ tương xứng với một khoảng chừng giá trị rất có thể biểu diễn.

Đối cùng với số nguyên không âm, kích thước 2N2^N2N byte sẽ tàng trữ được những số trong phạm vi trường đoản cú 000 tới (28×2N−1),(2^8 imes 2^N - 1),(28×2N−1), vì 111 byte bao gồm 888 bit và tổng thể các bit các được áp dụng để màn trình diễn giá trị số.

Đối với số nguyên gồm dấu, bit bên buộc phải nhất của số nguyên đang được dùng để làm thể hiện vệt của số đó, quy mong 111 là dấu âm, 000 là dấu dương, các bit sót lại sẽ dùng làm biểu diễn cực hiếm số. Theo đó, số nguyên form size 2N2^N2N sẽ trình diễn được các giá trị vào phạm vi (−28×2N−1+1)(-2^8 imes 2^N - 1 + 1)(−28×2N−1+1) cho (28×2N−1−1)(2^8 imes 2^N - 1 - 1)(28×2N−1−1). Vụ việc này sẽ tương quan tới vấn đề lựa chọn kiểu dữ liệu với kiểm soát bộ lưu trữ chương trình khi lập trình.

*

3.2. Màn biểu diễn số thực

Khác với bí quyết viết trong Toán học, khi mà ta sử dụng dấu (,)(,)(,) để phân cách giữa phần nguyên và phần phân; vào Tin học ta nuốm dấu (,)(,)(,) bởi dấu (.)(.)(.), và những nhóm ba chữ số cạnh nhau vẫn viết liền. Ví dụ, vào toán ta viết $123 456,$$789;$ thì trong Tin học sẽ viết là 123456.789123456.789123456.789.

Một cách màn biểu diễn mà máy tính sử dụng để lưu trữ số thực là dạng dấu chấm động, khi phần đông số thực sẽ được biểu diễn ở dạng ±M×10±Kpm M imes 10^pm K±M×10±K. Vào đó, 0,1≤M1,0,1 le M 0,1≤M1, MMM được hotline là phần định trị, cùng KKK là một trong những nguyên không âm được điện thoại tư vấn là phần bậc. Ví dụ, số 123456,789123 456,789123456,789 sẽ tiến hành biểu diễn dưới dạng 0.123456789×1060.123456789 imes 10^60.123456789×106.

4. Phân tách bóc các chữ số của một trong những nguyên

Giả sử số nguyên NNN gồm nnn chữ số được biểu diễn ở hệ thập phân bên dưới dạng:

N=dndn−1dn−2...d1N=d_nd_n-1d_n-2...d_1N=dn​dn−1​dn−2​...d1​

Phân tích kết cấu số của N,N,N, ta có:N=dn×10n−1+dn−1×10n−2+...+d1×100N=d_n imes 10^n - 1 + d_n-1 imes10^n-2+...+d_1 imes 10^0N=dn​×10n−1+dn−1​×10n−2+...+d1​×100⇒log(dn×10n−1)≤log(N)=log(dn×10n−1+dn−1×10n−2+...+d1×100)≤log(10n)Rightarrow log(d_n imes 10^n-1) le log(N)=log(d_n imes 10^n - 1 + d_n-1 imes10^n-2+...+d_1 imes 10^0) le log(10^n)⇒log(dn​×10n−1)≤log(N)=log(dn​×10n−1+dn−1​×10n−2+...+d1​×100)≤log(10n)⇔(n−1)≤log(N)≤nLeftrightarrow (n-1)le log(N) le n⇔(n−1)≤log(N)≤n.⇔log(N)≤n≤log(N)+1Leftrightarrow log(N) le n le log(N)+1⇔log(N)≤n≤log(N)+1.

Giữa nhì số log(N)log(N)log(N) với log(N)+1log(N)+1log(N)+1 chỉ bao gồm duy nhất một số trong những là +1+1+1. Vậy n=+1n=+1n=+1. Ta gồm thể thiết lập chương trình tính số chữ số của số nguyên NNN như sau:

int cnt_digits(int N) int digits = 0; while (N != 0) ++digits; N /= 10; return digits;Hoặc thực hiện trực tiếp hàm log10 extlog10log10 của tủ sách vào C++:

int cnt_digits(int N) return (int)log10(N) + 1;Dựa vào màn biểu diễn trên của số nguyên N,N,N, ta nhận thấy, chữ số hàng đơn vị chức năng của N chính bằng N % 10,N \% 10,N % 10, chữ số hàng chục bằng N % 100,...,N \% 100,...,N % 100,..., chữ số sống hàng vật dụng KKK tính từ đề nghị qua trái chính bởi N % 10KN \% 10^KN % 10K. Đối với bất kỳ hệ cơ số nào ta cũng có thể coi như vẫn ở hệ cơ số 101010 nhằm tìm các chữ số từ buộc phải qua trái theo phong cách này.

Cài đặt:

int find_k_digits(int N, int K) int power = (int)pow(10, K); return N % power;III. đổi khác giữa những hệ cơ số

1. Thay đổi từ hệ cơ số 101010 sang các hệ cơ số khác

Xét số thực NNN ở hệ cơ số 101010. Để tìm trình diễn của NNN trong hệ cơ số bbb, ta sẽ lần lượt chuyển đổi phần nguyên cùng phần phân, tiếp đến ghép chúng lại với nhau.

1.1. Biến hóa phần nguyên

Xét phần nguyên của NNN là KKK. đưa sử trong hệ đếm b, KKK có mức giá trị là:

K=dnbn+dn−1bn−1+...+ d1b+d0K=d_nb^n + d_n-1b^n-1 + ... + ext d_1b + d_0K=dn​bn+dn−1​bn−1+...+ d1​b+d0​

Do 0≤d0b0 le d_0 0≤d0​b nên khi chia KKK cho bbb thì phần dư của phép phân tách là d0d_0d0​, còn yêu thương là:

K1=dnbn+dn−1bn−1+...+ d1K_1=d_nb^n + d_n-1b^n-1 +...+ ext d_1K1​=dn​bn+dn−1​bn−1+...+ d1​

Tương tự, d1d_1d1​ chính là phần dư của phép phân chia K1K_1K1​ mang đến b,b,b, với sẽ chiếm được K2K_2K2​ là thương của phép phân tách đó. Lặp lại quy trình chia như bên trên tới lúc thu được thương bằng 000, khi đó biểu diễn của KKK làm việc hệ cơ số bbb là dn...d0d_n...d_0dn​...d0​. Nói cách khác, ta rước KKK chia cho bbb, thu dấn thương với số dư ở mỗi lần chia tính đến khi thương bằng 000, khi đó viết các số dư theo trang bị tự ngược từ dưới lên trên thì đang thu được màn biểu diễn của KKK nghỉ ngơi hệ cơ số bbb.

Ví dụ, cùng với K=410K=4_10K=410​ và b=2b=2b=2, quá trình thay đổi sẽ ra mắt như sau:

Chia 444 đến 222, chiếm được K1=2,d0=0K_1=2, d_0 = 0K1​=2,d0​=0.Chia 222 mang lại 222, chiếm được K2=1,d1=0K_2=1, d_1=0K2​=1,d1​=0.Chia 111 cho 222, thu được K3=0,d2=1K_3=0, d_2=1K3​=0,d2​=1.Tới đây quá trình dừng lại, thu được kết quả 410=10024_10=100_2410​=1002​.

Cài đặt:

// đưa phần nguyên K sang trọng hệ đếm b, lưu giữ vào string.string change_integer_path(int K, int b) string res; while (K != 0) res = (char)(K % b + 48) + res; K /= b; return res;

1.2. Chuyển đổi phần phân

Xét phần phân của số thực NNN là K′K"K′. Mang sử trong hệ đếm bbb, K′K"K′ có mức giá trị là:

K′=d−1b−1+d−2b−2+...+ d−mb−m (1)K"=d_-1b^-1+d_-2b^-2+...+ ext d_-mb^-m ext (1)K′=d−1​b−1+d−2​b−2+...+ d−m​b−m (1)

Nhân cả 222 vế của (1)(1)(1) cùng với bbb, ta có:

K1′=d−1+d−2b−1+...+ d−mb−(m−1)K"_1=d_-1+d_-2b^-1+...+ ext d_-mb^-(m-1)K1′​=d−1​+d−2​b−1+...+ d−m​b−(m−1)

Ta thấy, d−1d_-1d−1​ chính là phần nguyên của hiệu quả phép nhân K′K"K′ cùng với bbb, còn phần phân của tác dụng là:

K2′=d−2b−1+...+ d−mb−(m−1) (2)K"_2=d_-2b^-1+...+ ext d_-mb^-(m-1) ext (2)K2′​=d−2​b−1+...+ d−m​b−(m−1) (2)

Tiếp tục lặp lại phép nhân như bên trên với (2), ta vẫn thu được d−2d_-2d−2​ là phần nguyên. Làm liên tục theo cách này, sau cùng thu được dãy d−1d−2d−3...,d_-1d_-2d_-3...,d−1​d−2​d−3​..., trong số ấy 0≤dib0 le d_i 0≤di​b. Nói biện pháp khác, rước phần phân K′K"K′ nhân thường xuyên với bbb, ở từng bước một thu nhận chữ số tại phần nguyên của kết quả và lặp lại quy trình nhân cùng với phần phân của kết quả tính đến khi thu được con số chữ số như ý muốn.

Ví dụ, cùng với K′=0.12310,b=2K"=0.123_10, b=2K′=0.12310​,b=2 và buộc phải lấy tới 555 chữ số phần phân sinh hoạt kết quả, ta làm như sau:

0.123×2=0.246→d−1=00.123 imes 2 = 0.246 ightarrow d_-1=00.123×2=0.246→d−1​=0.0.246×2=0.492→d−2=00.246 imes 2 = 0.492 ightarrow d_-2=00.246×2=0.492→d−2​=0.0.492×2=0.984→d−3=00.492 imes 2 = 0.984 ightarrow d_-3=00.492×2=0.984→d−3​=0.0.984×2=1.968→d−4=10.984 imes 2 = 1.968 ightarrow d_-4=10.984×2=1.968→d−4​=1.0.968×2=1.936→d−5=10.968 imes 2 = 1.936 ightarrow d_-5=10.968×2=1.936→d−5​=1.⋯cdots⋯

Tới đây thu được công dụng 0.12310=0.00011...20.123_10=0.00011..._20.12310​=0.00011...2​

Cài đặt:

// đưa phần phân K quý phái hệ đếm B, mang cnt_digits chữ số phần phân.string change_double_path(double K, int B, int cnt_digits) string ans; while (ans.size() cnt_digits) double next_K = K * (double)B; int digit = (int)next_K; ans = ans + (char)(digit + 48); K = next_K - (int)next_K; return ans;

2. đổi khác hệ cơ số XXX sang hệ cơ số YYY

Để chuyển một số từ hệ cơ số XXX lịch sự hệ cơ số Y,Y,Y, ta làm theo các bước sau:

Bước 111: Tính quý giá của XXX, có thể nói là chuyển XXX thanh lịch hệ cơ số 101010.Bước 222: Chuyển tác dụng vừa kiếm được sang hệ cơ só YYY theo phương thức chuyển một số trong những ở hệ 101010 lịch sự hệ YYY ở chỗ 111.

Xem thêm: Top 20 Chữ Ký Số Tiếng Trung Là Gì ? 5 Điều Cần Biết Về Chữ Ký Số

Cài đặt:

// nhảy số thực N từ bỏ hệ đếm X sang trọng hệ đếm Y, đem D chữ số sau vết phẩy.string change_X_to_Y(double N, int X, int Y, int D) string NN = to_string(N); double value_X = get_value(NN, X); int integer_path = (int)value_X; double double_path = value_X - integer_path; string res = change_integer_path(integer_path, Y) + "." + change_double_path(double_path, Y, D); return res;

3. Thay đổi giữa hệ cơ số 222 (hệ nhị phân) với hệ cơ số 161616 (hệ Hexa)

Do 161616 là lũy quá của 222 (16=24)(16=2^4)(16=24), bắt buộc việc biến hóa giữa hệ nhị phân cùng hệ hexa hoàn toàn có thể được thực hiện thuận lợi theo quy tắc sau:

Bước 111: Tính tự vị trí phân làn phần nguyên và phần phân, ta gộp các chữ số thành từng đội 444 chữ số về nhị phía trái phải, nếu thiếu chữ số sẽ vắt bằng những chữ số 000.Bước 222:Tính quý hiếm của từng đội chữ số, sau đó thay hiệu quả bằng một kí hiệu khớp ứng ở hệ Hexa. Ví dụ như 222 tương xứng với 222, 101010 khớp ứng với AAA,...Bước 333: Đặt những kí hiệu sau khoản thời gian đã biến hóa vào đúng thứ tự của từng nhóm, ta thu được tác dụng chuyển đổi.

Cài đặt:

char hexa<16> = "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F";string binary_to_hexa(double N) string NN = to_string(N); int pos = NN.find("."); string left_path = NN.substr(0, pos), right_path = NN.substr(pos + 1, NN.size() - pos); // bổ sung cập nhật đủ chữ số 0 để sản xuất thành các nhóm 4. While (left_path.size() % 4 != 0) left_path = "0" + left_path; while (right_path.size() % 4 != 0) right_path = right_path + "0"; string ans_left, ans_right; for (int i = 0; i left_path.size() - 3; i += 4) // Gộp các 4 kí từ liên tiếp. String group = left_path.substr(i, 4); // Tính giá trị nhiều 4 kí tự. Int nguồn = 1, value = 0; for (int j = 3; j >= 0; --j) value += (group - "0") * power; power *= 2; // đem kí từ bỏ hexa mang giá trị tương ứng. Ans_left = ans_left + hexa; for (int i = 0; i right_path.size() - 3; ++i) string group = left_path.substr(i, 4); int power nguồn = 1, value = 0; for (int j = 3; j >= 0; --j) value += (group - "0") * power; nguồn *= 2; ans_right = ans_right + hexa; return (ans_left + "." + ans_right);Ở chiều hướng ngược lại, khi chuyển từ hệ nhị phân quý phái hệ hexa, chúng ta chỉ phải đổi từng kí tự hexa sang trọng cụm tư kí từ bỏ nhị phân có giá trị tương ứng, các bước này hoàn toàn có thể thực hiện thuận tiện như sau:

void hexa_to_binary(double N) string NN = to_string(N); for (int i = 0; i NN.size(); ++i) switch (NN) case "0": cout "0000"; break; case "1": cout "0001"; break; case "2": cout "0010"; break; case "3": cout "0011"; break; case "4": cout "0100"; break; case "5": cout "0101"; break; case "6": cout "0110"; break; case "7": cout "0111"; break; case "8": cout "1000"; break; case "9": cout "1001"; break; case "A": cout "1010"; break; case "B": cout "1011"; break; case "C": cout "1100"; break; case "D": cout "1101"; break; case "E": cout "1110"; break; case "F": cout "1111"; break; default: // trường hợp lốt "." chia cách phần nguyên với phần phân. Continue; break; IV. Tư liệu tham khảo