Lịch sử của bit và byte trong khoa học máy tính
1. Bit
Tôi bắt đầu câu chuyện bằng cách nói về hệ cơ số 10, khi bạn hiểu về hệ cơ số 10 câu chuyện của chúng ta sẽ không bị ngắt quãng và không bị khó hiểu.
OK, hệ cơ số 10 là một hệ cơ số phổ biến nhất hiện nay, nhưng nó không phải là duy nhất, có nhiều nền văn hóa sử dụng các hệ cơ số khác nhau trong quá khứ, tuy nhiên ngày nay hầu hết đã chuyển sang hệ cơ số 10. Hệ cơ số 10 sử dụng 10 con số 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, chúng được ghép lại với nhau để tạo ra một con số khác.
Nếu bạn chỉ có một ô, bạn chỉ có thể viết được một số từ 0 đến 9. Nhưng ..
- Nếu bạn có 2 ô, bạn có thể viết được 1 số có phạm vi từ 0 đến 99.
- Nếu bạn có 3 ô, bạn có thể viết được 1 số có phạm vi từ 0 đến 999.
Các ô từ phải sang trái đều có một thừa số, chúng lần lượt là 10^0, 10^1, 10^2, ...
BIT
BIT là một từ viết tắt của Binary digIT (Một đơn vị thông tin). Một bit chỉ giá trị 0 hoặc 1, nó được gọi là một đơn vị nhỏ nhất trong máy tính. 0, 1 là hai con số cơ bản của hệ cơ số 2.
Hãy suy luận như hệ cơ số 10 và áp dụng nó cho hệ cơ số 2, nếu bạn có 1 ô, bạn có thể viết được 2 con số 0 và 1. Nếu bạn có 2 ô số bạn có thể viết được 4 con số 00, 01, 10, và 11 (Chú ý: Đừng nhầm, các con số này đều là các con số của hệ số 2 đấy).
Với hệ cơ số 2, các ô từ phải sang trái đều có một thừa số, chúng lần lượt là 2^0, 2^1, 2^2, ...
Hình dưới đây mô tả cách đổi một số trong hệ cơ số 2 sang hệ cơ số 10.
Như vậy:
- Nếu bạn có 2 ô trong hệ cơ số 2, bạn viết được số lớn nhất là 11(2), nó tương đương với số 3 trong hệ cơ số 10.
- Nếu bạn có 3 ô trong hệ cơ số 2, bạn viết được số lớn nhất là 111(2), nó tương đương với số 7 trong hệ cơ số 10.
Số ô | Số lớn nhất (Hệ cơ số 2) | Quy đổi sang hệ cơ số 10 |
1 | 1 | 1 (2^1 - 1) |
2 | 11 | 3 (2^2 - 1) |
3 | 111 | 7 (2^3 - 1) |
4 | 1111 | 15 (2^4 - 1) |
5 | 11111 | 31 (2^5 - 1) |
6 | 111111 | 63 (2^6 - 1) |
7 | 1111111 | 127 (2^7 - 1) |
8 | 11111111 | 255 (2^8 - 1) |
9 | 111111111 | 511 (2^9 - 1) |
Tại sao máy tính sử dụng hệ cơ số 2, mà không phải là hệ cơ số 10?
Tới đây, chắc chắn bạn sẽ đặt ra câu hỏi "Tại sao máy tính sử dụng hệ cơ số 2? Tại sao lại không phải là hệ cơ số 10?". Trước kia tôi cũng đặt ra câu hỏi này, y như bạn vậy.
Máy tính hoạt động bằng cách sử dụng hàng triệu thiết bị chuyển mạch điện tử (electronic switches) (transistors), mỗi transistor đều bật hoặc tắt (tương tự như công tắc đèn, nhưng nhỏ hơn nhiều). Trạng thái chuyển đổi (hoặc bật hoặc tắt) có thể biểu diễn thông tin nhị phân, chẳng hạn như có hoặc không, đúng hay sai, 1 hoặc 0. Đơn vị cơ bản của thông tin trong máy tính là số nhị phân (binary digit). Mặc dù các máy tính có thể đại diện cho một sự đa dạng đáng kinh ngạc của thông tin, tất cả các biểu diễn cuối cùng phải được giảm xuống thành trạng thái ON/OFF (bật/tắt) của bóng bán dẫn (transistor).
Như vậy câu trả lời là máy tính không có nhiều trạng thái để lưu trữ thông tin, vì vậy nó lưu trữ thông tin dựa trên 2 trạng thái ON và OFF (Tương ứng là 1 và 0).
Cái ổ cứng máy tính của bạn cũng lưu trữ dữ liệu dựa trên nguyên lý 0, 1. Ổ cứng máy tính bao gồm các đầu ghi và các đầu đọc, nó có một hoặc nhiều đĩa, các đĩa này được phủ lên một lớp từ niken (magnetic layer of nikel), các hạt từ (magnetic particle) có thể có hướng Nam-bắc hoặc Bắc-nam, đó là 2 trạng thái của hạt từ, và nó tương ứng với 0 và 1.Đầu đọc của ổ cứng có thể nhận biết được hướng của từng hạt từ để chuyển đổi nó thành các tín hiệu 0 hoặc 1.Dữ liệu cần lưu trữ vào ổ cứng là một dòng các tín hiệu 0 hoặc 1. Đầu ghi của ổ cứng dựa vào tín hiệu này và làm thay đổi hướng của từng hạt từ cho phù hợp. Đây chính là nguyên tắc lưu trữ dữ liệu của ổ cứng.
2. Byte
Byte là một đơn vị của máy tính, nó tương đương với 8 bit. Như vậy một byte có thể biểu diễn một số trong phạm vi từ 0 đến 255.
Tại sao 1 byte = 8 bit?
Câu hỏi của bạn lúc này là "Tại sao 1 byte = 8 bit, sao không phải là 10 bit?".
Thời gian đầu của thời đại máy tính người ta đã sử dụng baudot như một đơn vị cơ bản, nó tương đương với 5 bit, nghĩa là có thể biểu diễn được các con số từ 0 đến 31. Nếu mỗi con số đại diện cho một ký tự thì 32 là đủ dùng cho các ký tự chữ hoa A, B, ... Z, và một vài ký tự nữa, nó không đủ cho tất cả các ký tự chữ thường.
Ngay sau đó, một vài máy tính sử dụng 6 bit để biểu diễn các ký tự, và nó có thể biểu diễn tối đa 64 ký tự. Nó đủ dùng cho A, B, .. Z, a, b.. Z, 0, 1, 2, .. 9. Nhưng không đủ cho các ký tự khác như +,-,*, / và các ký tự khoảng trắng. Vậy là 6 bit nhanh chóng trở lên hạn chế.
ASCII đã định nghĩa một tập ký tự 7-bit (7-bit character set). Đó là "đủ tốt" cho rất nhiều việc sử dụng trong một thời gian dài, và đã hình thành cơ sở của hầu hết các bộ ký tự mới nhất là (ISO 646, ISO 8859, Unicode, ISO 10646, v..v)
Bảng ASCII:
8-bit, nhiều hơn một chút so với 7-bit sẽ là tốt hơn, nó không gây ra sự lãng phí quá lớn. 8-bit là tập các số từ 0 đến 255 và nó làm hài lòng các nhà thiết kế máy tính, khái niệm byte ra đời, 1 byte = 8 bit.
Với 8-bit, các nhà thiết kế có thể định nghĩa thêm các ký tự khác, bao gồm các ký tự đặc biệt của máy tính. Bảng mã ANSI ra đời là sự thừa kế từ bảng mã ASCII:
Bảng ANSI:
Hiện nay có nhiều bảng mã ký tự (character sets) ra đời nhằm mục đích mã hóa các ký tự trong các ngôn ngữ khác nhau. Ví dụ chữ Trung Quốc, chữ Nhật đều đòi hỏi rất nhiều ký tự, trong trường hợp này người ta sử dụng 2 byte, hoặc 4 byte để định nghĩa một ký tự.
Java cơ bản
- Tùy biến trình biên dịch java xử lý Annotation của bạn (Annotation Processing Tool)
- Lập trình Java theo nhóm sử dụng Eclipse và SVN
- Hướng dẫn và ví dụ Java WeakReference
- Hướng dẫn và ví dụ Java PhantomReference
- Hướng dẫn nén và giải nén trong Java
- Cấu hình Eclipse để sử dụng JDK thay vì JRE
- Phương thức String.format() và printf() trong Java
- Cú pháp và các tính năng mới trong Java 5
- Cú pháp và các tính năng mới trong Java 8
- Hướng dẫn sử dụng biểu thức chính quy trong Java
- Hướng dẫn lập trình đa luồng trong Java - Java Multithreading
- Thư viện điều khiển các loại cơ sở dữ liệu khác nhau trong Java
- Hướng dẫn sử dụng Java JDBC kết nối cơ sở dữ liệu
- Lấy các giá trị của các cột tự động tăng khi Insert một bản ghi sử dụng JDBC
- Hướng dẫn và ví dụ Java Stream
- Functional Interface trong Java
- Giới thiệu về Raspberry Pi
- Hướng dẫn và ví dụ Java Predicate
- Abstract class và Interface trong Java
- Access modifier trong Java
- Hướng dẫn và ví dụ Java Enum
- Hướng dẫn và ví dụ Java Annotation
- So sánh và sắp xếp trong Java
- Hướng dẫn và ví dụ Java String, StringBuffer và StringBuilder
- Hướng dẫn xử lý ngoại lệ trong Java - Java Exception Handling
- Hướng dẫn và ví dụ Java Generics
- Thao tác với tập tin và thư mục trong Java
- Hướng dẫn và ví dụ Java BiPredicate
- Hướng dẫn và ví dụ Java Consumer
- Hướng dẫn và ví dụ Java BiConsumer
- Bắt đầu với Java cần những gì?
- Lịch sử của Java và sự khác biệt giữa Oracle JDK và OpenJDK
- Cài đặt Java trên Windows
- Cài đặt Java trên Ubuntu
- Cài đặt OpenJDK trên Ubuntu
- Cài đặt Eclipse
- Cài đặt Eclipse trên Ubuntu
- Học nhanh Java cho người mới bắt đầu
- Lịch sử của bit và byte trong khoa học máy tính
- Các kiểu dữ liệu trong Java
- Các toán tử Bitwise
- Câu lệnh rẽ nhánh (if else) trong Java
- Câu lệnh rẽ nhánh switch trong Java
- Vòng lặp trong Java
- Mảng (Array) trong Java
- JDK Javadoc định dạng CHM
- Thừa kế và đa hình trong Java
- Hướng dẫn và ví dụ Java Function
- Hướng dẫn và ví dụ Java BiFunction
- Ví dụ về Java encoding và decoding sử dụng Apache Base64
- Hướng dẫn và ví dụ Java Reflection
- Hướng dẫn gọi phương thức từ xa với Java RMI
- Hướng dẫn lập trình Java Socket
- Các nền tảng nào bạn nên chọn để lập trình ứng dụng Java Desktop?
- Hướng dẫn và ví dụ Java Commons IO
- Hướng dẫn và ví dụ Java Commons Email
- Hướng dẫn và ví dụ Java Commons Logging
- Tìm hiểu về Java System.identityHashCode, Object.hashCode và Object.equals
- Hướng dẫn và ví dụ Java SoftReference
- Hướng dẫn và ví dụ Java Supplier
- Lập trình Java hướng khía cạnh với AspectJ (AOP)
Show More
- Hướng dẫn lập trình Java Servlet/JSP
- Các hướng dẫn Java Collections Framework
- Java API cho HTML & XML
- Các hướng dẫn Java IO
- Các hướng dẫn Java Date Time
- Các hướng dẫn Spring Boot
- Các hướng dẫn Maven
- Các hướng dẫn Gradle
- Các hướng dẫn Java Web Services
- Các hướng dẫn lập trình Java SWT
- Các hướng dẫn lập trình JavaFX
- Các hướng dẫn Java Oracle ADF
- Các hướng dẫn Struts2 Framework
- Các hướng dẫn Spring Cloud