← Quay lại
06/01/2026 36 phút

Chương 11: Từng bit từng bit một

Một câu chuyện tình xuất hiện muộn nhất là vào những năm 50 kể về một người đàn ông trên hành trình trở về quê hương sau quãng thời gian dài bị cầm tù ở một nơi xa xôi. Anh ta không biết liệu rằng khi trở về có ai chào đón mình không nên đã yêu cầu một dấu hiệu trong hình hài của một miếng vải buộc quanh thân cây. Trong một phiên bản khác, người đàn ông đang trên tàu lửa trở về nhà và hy vọng nhìn thấy một dải băng trắng treo trên cây táo. Và trong một phiên bản khác nữa thì kể anh ta ngồi trong xe buýt về gặp vợ và mong đợi thấy một chiếc khăn tay màu vàng trên cây sồi. Trong cả 2 phiên bản, người đàn ông khi trở về đều nhìn thấy trên cây phủ hàng trăm miếng vải minh chứng cho sự chào đón nhiệt tình của mọi người.

Câu chuyện phổ biến hơn vào năm 1973 với bản hit "Tie a Yellow Ribbon Round the Ole Oak Tree", và kể từ đó việc treo một dải ruy băng màu vàng đã trở thành phong tục khi các thành viên gia đình hoặc người thân yêu đang ở nơi xa xôi ngập tràn bom đạn.

Người đàn ông chỉ muốn ruy băng vàng chứ không cần phải nói nhiều. Anh ta muốn ruy băng vàng có nghĩa là "vâng, mặc dù anh đã sinh sự và vào tù 3 năm, em vẫn mong chờ anh trở về dưới mái nhà này". Còn nếu về mà không thấy nó thì nghĩa là "đừng có mơ mà đặt chân tới đây".

Đây là 2 thái cực rõ ràng không chồng chéo nhau. Hiệu quả tương tự với ruy băng vàng (nhưng có lẽ kỳ cục hơn khi đặt vào trong lời bài hát) là tín hiệu giao thông ở trước sân: có lẽ là “Nhập làn” hay “Sai Đường”.

Hay một biển báo treo trên cửa: “Đóng” hoặc “Mở”.

Hay một cây đèn pin trong cửa sổ, được bật hoặc tắt.

Như bạn đã khám phá trong 2 chương trước, chẳng có gì đặc biệt về hệ số thập phân mà chúng ta dùng để đếm. Khá rõ ràng rằng ta đặt 10 làm nền tảng của hệ số là do số ngón tay mà ta có. Cũng sẽ hợp lẽ nếu đặt nền tảng của hệ số lên 8 (nếu ta là nhân vật hoạt hình) hoặc 4 (nếu là tôm hùm) hoặc thậm chí là 2 (nếu là cá heo).

Chả có gì đặc biệt về hệ thập phân, nhưng lại điều đặc biệt về hệ nhị phân, vì nhị phân là hệ số đơn giản nhất có thể có. Chỉ với 2 chữ số nhị phân—0 và 1. Nếu ta muốn thứ gì đó đơn giản hơn nhị phân, ta phải bỏ số 1 để chỉ còn lại số 0, thế thì chẳng làm được gì nhiều nhặn.

Từ bit, đặt ra mang nghĩa là số nhị phân, chắc chắn là một trong những từ dễ thương nhất đã được phát minh mà liên quan tới máy tính. Tất nhiên, từ đó có một nghĩa bình thường, “một khoảng, đơn vị, độ nhỏ”, và cái nghĩa thông thường ấy hoàn hảo là bởi một bit – một số nhị phân – đúng là một lượng rất nhỏ.

Lắm lúc khi một từ mới được nghĩ ra, nó cũng mang một nghĩa mới. Chính xác cho cả trường hợp này. Một bit có một nghĩa vượt trên các chữ số nhị phân cho cá heo tập đếm. Trong thời đại máy tính, bit được xem như là khối cấu trúc cơ bản của thông tin.

Tôi chém hơi mạnh nhỉ, nhưng tất nhiên, các bit không phải là thứ duy nhất truyền thông tin. Chữ cái, từ ngữ, mã Morse, mã Braille và các chữ số thập phân cũng truyền thông tin. Điều đặc biệt ở bit đó là nó truyền một lượng thông tin rất nhỏ. Một bit thông tin là một lượng thông tin nhỏ nhất có thể dù là dành cho một thông tin cực kì hệ trọng như ruy băng vàng chẳng hạn. Bất kể thứ gì ít hơn một bit thì không mang chút thông tin nào. Nhưng vì một bit đại diện cho một lượng thông tin nhỏ nhất có thể, nên những thông tin phức tạp hơn có thể được truyền đi với nhiều bit hơn.

Henry Wadsworth Longfellow đã viết

"Ầu ơ ví dầu trời tối lắng nghe
Đội Paule Revere lặng thầm bước đi" 

và trong khi ông ta có thể không chính xác về mặt lịch sử khi miêu tả cách mà Paul Revere đã báo hiệu cho người Mỹ về sự xâm lược của Anh, ông đã cung cấp một ví dụ đáng để suy nghĩ về việc sử dụng các bit để truyền đạt thông tin quan trọng:

Anh ta nhắn đám bạn mình
Đêm nay Anh Cát Lợi binh từ thành
Vượt rừng băng biển chẳng lành
Ngọn đèn được thắp trong vành tháp chuông
Trên nhà thờ bắc theo khuôn –
Một cho đi bộ đi xuồng thì hai…”

(Dịch thơ ghê chưa ghê chưa :)))

Tóm lại, cậu bạn của Paul Revere có hai cái đèn lồng. Nếu lính Anh xâm lược bằng đường bộ, thì cậu ta chỉ đặt một cái đèn vào trong tòa tháp nhà thờ. Nếu lính Anh đi đường biển, thì cậu ta sẽ đặt luôn hai cái.

Tuy nhiên, Longfellow không công khai nhắc đến tất cả các tình huống có thể xảy ra. Ông để ngỏ khả năng thứ ba, đó là lính Anh vẫn chưa xâm chiếm. Longfellow ngầm nhắn là trường hợp này sẽ được truyền tin bằng sự vắng mặt của các ngọn đèn trong thành nhà thờ.

Hãy giả sử rằng hai cái đèn lồng thực tế được gắn chặt vào trong tòa tháp nhà thờ. Những lúc bình thường thì chúng không được thắp sáng:

image.png 51.3 KB


Điều đó có nghĩa là lính Anh vẫn chưa đến. Nếu một trong các ngọn đèn được thắp,

image.png 51.8 KB

hoặc

image.png 52 KB


thì lính Anh đang đến bằng đường bộ. Nếu cả hai đèn đều được thắp sáng,

image.png 53.1 KB
thì lính Anh đến bằng đường biển.

Mỗi chiếc đèn là một bit và có thể được đại diện bởi 1 hoặc 0. Câu chuyện ruy băng màu vàng mô phỏng chỉ 1 bit là đủ để truyền tải 1 trong 2 khả năng. Nếu Paul Revere chỉ cần báo động rằng lính Anh đang đến (và không biết đi bằng đường nào hết), thì một cái đèn thôi đã đủ rồi. Đèn sẽ được thắp sáng cho một cuộc xâm lăng và không thắp cho một đêm bình yên nữa.

Truyền đi một trong ba tình huống thì cần phải có thêm một cái đèn khác. Tuy nhiên, một khi có thêm cái đèn thứ hai thì, với hai bit lại có thể truyền đi tới bốn trường hợp lận:

00 = Anh sẽ không chiếm đánh tối nay.
01= Chúng đến bằng đường bộ.
10 = Chúng đến bằng đường bộ.
11 = Chúng đến bằng đường thủy.

Paul Revere chỉ quan tâm tới ba khả năng là một tính toán khá tinh tế. Trong ngôn ngữ của thuyết truyền thông, ông dùng tính dư thừa để trung hòa ảnh hưởng của nhiễu. Nhiễu được dùng trong lý thuyết truyền thông để ám chỉ bất cứ thứ gì can thiệp vào đường truyền. Đường truyền di động tệ là 1 ví dụ điển hình cho nhiễu đã can thiệp vào liên lạc điện thoại. Trò chuyện qua điện thoại bình thường ngon lành dù có nhiễu đi nữa bởi vì ngôn ngữ nói mang tính thừa rất nhiều. Chúng ta không cần phải nghe mọi âm tiết của một từ để mà hiểu hết những gì được nói ra.

Trong trường hợp các chiếc đèn trong tháp nhà thờ, nhiễu có thể được ám chỉ đến bóng tối và khoảng cách của Paul Revere từ tòa tháp, cả hai có thể làm cản trở ông phân biệt cái đèn này với cái đèn kìa. Đây là đoạn cốt yếu trong bài thơ của Longfellow:

Và xem kìa, anh nhìn về tháp chuông
Một tia nhấp nháy nhẹ tuôn
Anh nắm dây cương phóng luôn lên ngựa
Nhưng chần chừ và lơ đãng
Một ngọn đèn khác đã sáng trên lầu!


Hẳn là không phải Paul Revere đang cố nhận ra xem chính xác thì cái đèn nào được thắp sáng trước.

Khái niệm thiết yếu ở đây là thông tin đại diện cho một sự lựa chọn trong hai hay nhiều lựa chọn có thể có. Ví dụ, khi chúng ta nói chuyện với người khác, mọi từ mà ta nói là một sự lựa chọn trong tất cả các từ có trong từ điển. Nếu chúng ta gắn số cho tất cả các từ trong từ điển từ 1 tới 351.482, thì ta có thể tiếp tục các cuộc trò chuyện khác bằng cách dùng số mà có vẻ lại chính xác hơn cả dùng chữ. (Tất nhiên, cả hai người nói chuyện đều cần từ điển đã được đánh số sẵn, kèm theo một núi kiên nhẫn).

Mặt còn lại của vấn đề này là mọi thông tin nào đều có thể giảm đi thành một lựa chọn trong hai hay nhiều khả năng có thể được mô tả bằng bit. Khỏi phải nói, có rất nhiều dạng giao tiếp của con người mà không cần đại diện các sự lựa chọn trong các khả năng riêng lẻ và chúng cũng quan trọng cho sự tồn tại của chúng ta. Đây là lý do tại sao con người không hình thành các mối quan hệ lãng mạn với máy tính. (Dù gì thì cũng hãy hy vọng rằng bọn họ sẽ không như vậy). Nếu bạn không thể diễn tả thứ gì đó bằng từ ngữ, hình ảnh hay âm thanh, bạn sẽ không có khả năng mã hóa các thông tin thành các bit. Mặc cho bạn muốn như thế đi nữa.

Đã hơn một thập kỷ về cuối thế kỷ 20, nhạc phê bình phim Gene Siskel và Robert Ebert đã mô phỏng sự vận dụng của bit trong chương trình TV mà họ dẫn, được gọi là At the Movies. Sau khi phục vụ nhiều review phim chi tiết họ muốn đưa ra 1 đánh giá cuối cùng với ngón cái lên hoặc xuống.

Nếu 2 ngón cái là các bit thì họ có thể đại diện được 4 trường hợp:

00 = Bọn họ đều ghét nó.
01 = Siskel ghét nó; Ebert thích nó.
10 = Siskel thích nó; Ebert ghét nó.
11 = Bọn họ đều thích nó.

Bit đầu tiên là bit Siskel, là 0 nếu Siskel ghét bộ phim và là 1 nếu ông ta thích nó. Tương tự, bit thứ hai là bit Ebert.

Thế nên trở về những ngày của At the Movies nếu cậu bạn của bạn hỏi, “Siskel và Ebert đánh giá thế nào về bộ phim Impolite Encounter?” thay vì trả lời, “Siskel cho nó ngón cái chỉ lên và Ebert cho nó ngón cái chỉ xuống” hay thậm chí “Siskel thích nó Ebert thì không” bạn có thể đơn giản chỉ nói” Một không”, hoặc nếu bạn đổi về hệ tứ phân thì là "Hai". Miễn bạn của bạn biết cái nào là bit Siskel, cái nào là bit Ebert và bit 1 nghĩa là thích bit 0 nghĩa là không thích thì câu trả lời của bạn được hiểu hoàn toàn. Nhưng 2 đứa bạn phải biết mã.

Ta có thể định trước rằng bit 1 mang nghĩa là không thích và bit 0 nghĩa là thích. Nghe thì hơi ngược đời. Vì thường chúng ta thích nghĩ về 1 như là đại diện cho thứ gì đó có vẻ khẳng định và 0 thì ngược lại, nhưng nó chỉ là một phép gán tùy hứng thôi. Yêu cầu duy nhất là mọi người dùng mã phải biết các bit 1 và 0 mang nghĩa gì.

Ý nghĩa của một bit cụ thể hay một nhóm các bit luôn luôn được hiểu theo ngữ cảnh. Ý nghĩa của dải ruy băng vàng quấn quanh một cây sồi cụ thể có thể chỉ được biết với một người đã đặt nó ở đó và người được mong chờ sẽ thấy. Thay đổi màu sắc, chọn một cây hay ngày khác thì nó sẽ thành một miếng vải vô nghĩa. Tương tự, để có một vài thông tin hữu ích từ cử chỉ của Siskel và Ebert, ít nhất chúng ta cần biết bộ phim nào được bàn luận.

Nếu đang xem At the Movies và cầm một danh sách phim mà Siskel và Ebert dùng để bình chọn, bạn có thể thêm một bit khác vào đống này cho ý kiến của riêng mình. Thêm một bit thứ ba làm tăng số các khả năng lên tám:

000 = Siskel ghét nó; Ebert ghét nó; Tôi ghét nó.
001 = Siskel ghét nó; Ebert ghét nó; Tôi thích nó.
010 = Siskel ghét nó; Ebert thích nó; Tôi ghét nó.
011 = Siskel ghét nó; Ebert thích nó; Tôi thích nó.
100 = Siskel thích nó; Ebert ghét nó; Tôi ghét nó.
101 = Siskel thích nó; Ebert ghét nó; Tôi thích nó.
110 = Siskel thích nó; Ebert thích nó; Tôi ghét nó.
111 = Siskel thích nó; Ebert thích nó; Tôi thích nó.

Một điểm cộng của việc dùng các bit đại diện cho thông tin là chúng ta biết có thể tính được các khả năng khả thi. Chúng ta biết có tám và chỉ tám khả năng, không thêm bớt gì nữa. Với 3 bit, ta chỉ đếm được từ 0 tới 7. Không có thêm các số nhị phân 3 chữ số nào nữa cả. Như bạn đã khám phá ở cuối chương trước, những số nhị phân 3 chữ số này có thể được diễn tả bằng số bát phân từ không tới 7.

Bất cứ khi nào ta nói về bit, ta thường nói về 1 số lượng bit cụ thể. Càng có nhiều bit thì càng có nhiều các khả năng khác nhau mà ta có thể truyền tải.

Nó cũng tương tự với số thập phân, tất nhiên. Ví dụ, có bao nhiêu mã vùng điện thoại? Mã vùng là các số thập phân 3 chữ số và nếu tất cả các tổ hợp của 3 chữ số được dùng (nhưng thực tế lại không, nhưng ta hãy cứ cho qua nó đi) có 10 mũ 3 hay 1000 mã trong khoảng từ 000 tới 999. Có bao nhiêu số điện thoại 7 chữ số có thể có trong mã vùng 212? Đó là 10 mũ 7 hay 10.000.000. Có bao nhiêu số điện thoại có thể có với mã vùng 212 và tiền tố 260? Đó là 10 mũ 4 hay 10.000.

Tương tự, trong nhị phân số lượng mã có thể có luôn luôn bằng với 2 lũy thừa với số lượng bit:

Số lượng bit | Số lượng mã
      1      |   2^1 = 2
      2      |   2^2 = 4
      3      |   2^3 = 8
      4      |   2^4 = 16
      5      |   2^5 = 32
      6      |   2^6 = 64
      7      |   2^7 = 128
      8      |   2^8 = 256
      9      |   2^9 = 512
      10     |   2^10 = 1024

Cứ thêm 1 bit sẽ làm gấp đôi số lượng mã.

Nếu bạn biết được số lượng mã mình cần làm thế nào để tính được số lượng bit cần? Hay nói cách khác, bạn cách nào để tra ngược bảng trên?

Kiến thức toán bạn cần là logarit cơ số 2. Logarit ngược lại với luỹ thừa. Ta biết rằng 2 lũy thừa 7 bằng 128. Logarit cơ số 2 của 128 bằng 7. Dùng kí hiệu toán học cho biểu thức này

2^7 = 128

Tương đương với

log2(128) = 7

Nên nếu logarit cơ số 2 của 128 là 7 và logarit cơ số 2 của 256 là 8 thì logarit cơ số 2 của các số từ 128 đến 256 là bao nhiêu? - ví dụ như 200? Bằng khoảng 7.64, nhưng ta không cần thiết phải biết. Nếu ta cần đại diện 200 thứ khác nhau với bit ta chỉ cần 8 bit như khi Paul Revere cần hai đèn lồng để truyền đi một trong ba khả năng. Nếu chặt chẽ theo toán học, số lượng bit mà Paul Revere cần cho ba khả năng của mình là logarit cơ số 2 của 3 hay khoảng 1,6 nhưng trong thực tế ông ấy cần 2.

Bit thường được giấu sâu bên trong các thiết bị điện khỏi tầm mắt thường. Ta không thể nào nhìn thấy các bit được mã hóa bên trong máy tính, hay truyền qua dây mạng, hay trong sóng điện từ xung quanh các cục phát Wi-Fi. Nhưng đôi khi bit có thể được nhìn thấy rõ ràng.

Như trường hợp vào ngày 18 tháng 2 năm 2021, khi xe tự hành Perseverance đặt chân lên sao Hoả. Cái dù xuất hiện trong một tấm ảnh từ xe truyền về được tổng hợp từ 320 sọc vải màu trắng và cam được sắp đặt trong 4 vòng tròn đồng tâm.

image.png 236 KB


Không mất nhiều thời gian để người dùng Twitter giải mã mẫu hình. Chìa khóa là chia các sọc vải này thành nhóm 7 chứa cả màu cam và trắng. Những nhóm này luôn được tách bởi 3 sọc trắng. Vùng gồm các sọc màu cam nối đuôi nhau bị bỏ qua. Trong biểu đồ này, mỗi nhóm 7 sọc được bọc bằng 1 đường màu đen đậm.

image.png 262 KB


Mỗi nhóm này là 1 số nhị phân với sọc trắng đã diện cho 0 và sọc cam đại diện cho 1. Ngay bên trên vòng tròn trong cùng là nhóm đầu tiên. Đi theo chiều kim đồng hồ, 7 sọc này mã hóa số nhị phân 0000100 hay số thập phân 4. Chữ cái thứ tư trong bảng chữ cái là D. Nhóm thứ 2 theo chiều kim đồng hồ là 0000001 hay số thập phân 1. Đó là chữ A. Kế tiếp là 0010010, số thập phân 18. Chữ cái thứ 18 trong bảng chữ cái là R. Tiếp theo là 00000101, số thập phân 5, là chữ E. Từ đầu tiên là DARE (dám).

Giờ nhảy tiếp ra tầng ngoài. Bit là 0001101 hay số 13 trong hệ thập phân, chữ M. Khi bạn làm xong hết sẽ đánh vần được 3 chữ, 1 cụm từ bắt nguồn từ Teddy Roosevelt và nó đã trở thành khẩu hiệu không chính thức của Phòng thí nghiệm sức đẩy phản lực NASA. (DARE MIGHTY THINGS)

image.png 267 KB


Xung quanh vòng tròn ngoài cũng là những số đã được mã hóa, hé lộ kinh độ và vĩ độ của Phòng thí nghiệm sức đẩy phản lực: 34°11′58″N 118°10′31″W. Với hệ thống mã hóa đơn giản được dùng ở đây, không có sự phân biệt giữa chữ cái và chữ số. Số 10 và 11 là 1 phần của tọa độ địa lý cũng có thể là chữ cái J và K. Chỉ có ngữ cảnh nói cho chúng ta biết rằng đó là những con số.

Có lẽ hiển thị trực quan phổ biến nhất của số nhị phân là Universal Product Code (UPC), ký hiệu mã vạch xuất hiện hầu như trên mọi gói đồ mà chúng ta mua. UPC là một trong hàng tá mã vạch dùng cho nhiều mục đích khác nhau. Nếu bạn có bản giấy của sách này, bạn sẽ thấy ở mặt sau quyển sách một mã vạch mã hóa International Standard Book Number, hay ISBN.

Mặc dù UPC có tạo ra chút ít lầm tưởng khi lần đầu được giới thiệu, nhưng nó thật là một thứ bé nhỏ vô tội, được phát minh cho mục đích thanh toán tự động ở cửa hàng tiện lợi, điều mà nó làm rất tốt. Trước UPC, các máy tính tiền siêu thị không thể cung cấp được hóa đơn bán hàng chi tiết. Giờ đây điều này đã phổ biến.

Thứ làm ta quan tâm ở đây đó là UPC là mã nhị phân, mặc dù trong nó có vẻ không giống gì khi mới nhìn vào. Sẽ rất thú vị nếu giải mã UPC và tìm hiểu cách hoạt động của nó. Trong dạng phổ biến nhất, UPC là tập hợp của 30 vạch đen dọc có kích thước khác nhau, được tách rời bởi các khoảng trống kích thước khác nhau, đi cùng với vài chữ số. Ví dụ, đây là UPC xuất hiện trên 1 lon súp mì gà Campell's:

image.png 12.3 KB


UPC tương tự cũng đã xuất hiện trong phiên bản đầu tiên của quyển sách. Nó không thay đổi 1 chút nào trong 20 năm.

Chúng ta có xu hướng dịch trực quan UPC theo định dạng vạch mỏng hay đen, khoảng cách và độ rộng, đó là một cách nhìn đúng đắn. Các vạch đen trong mã UPC có thể có 4 độ rộng khác nhau, với vạch dày hơn thì sẽ rộng gấp 2,3 hoặc 4 lần vạch mỏng nhất. Tương tự như vậy các khoảng trống rộng hơn giữa các vạch gấp 2,3 hoặc 4 lần độ rộng của khoảng trống mỏng nhất.

Nhưng 1 cách khác để kiểm tra mã UPC là xem nó như là 1 chuỗi các bit. Luôn nhớ rằng toàn bộ ký hiệu mã vạch không chính xác là những gì máy quét "nhìn thấy" ở quầy tính tiền. Máy quét không cố gắng dịch con số được in ở phía dưới ví dụ vậy, bởi vì như thế cần phải có một kĩ thuật tính toán tinh vi hơn, được biết đến là nhận dạng ký tự quang học hay OCR. Thay vào đó máy quét chỉ nhìn thấy 1 vệt mỏng của toàn khối. UPC to như vậy chỉ nhằm giúp cho nhân viên thanh toán dễ nhắm trúng vào máy quét. Vệt mà mấy quét nhìn thấy có thể được mô phỏng như sau:

image.png 5.75 KB


Nhìn nó gần giống với mã Morse, đúng không? Thật ra phát minh ban đầu của mã vạch có thể quét được phần nào lấy cảm hứng từ mã Morse.

Khi máy tính quét thông tin này từ trái sang phải, nó gán bit 1 cho vạch đen đầu tiên mà nó gặp và bit 0 cho khoảng trống kế tiếp. Các khoảng trống và vạch sau đó được đặt thành 1 chuỗi của 1, 2, 3 hoặc 4 bit trong một hàng, phụ thuộc vào độ rộng của khoảng trống hoặc của vạch. Giá trị tương ứng của mã vạch khi được quét thành bit chỉ đơn giản là vậy thôi:

image.png 12 KB


Vậy nên toàn bộ UPC chỉ là một chuỗi 95 bit. Trong ví dụ cụ thể này, bit có thể được nhóm lại như sau:

image.png 59.3 KB


3 bit đầu tiên luôn luôn là 101. Nó được biết đến là mẫu bảo vệ tay trái, và nó cho phép thiết bị quét máy tính tuân theo. Từ mẫu bảo vệ này, máy quét có thể xác định độ rộng của vạch và khoảng trống tương ứng cho từng bit. Bằng không, UPC  phải có cùng kích thước trên tất cả gói hàng.

Theo sau mẫu bảo vệ tay trái là 6 nhóm 7 bit. Bạn sẽ sớm biết cách thức mà mỗi nhóm này là mã cho một chữ số từ 0 tới 9. Rồi tới mẫu bảo vệ trung tâm 5 bit. Sự có mặt của mẫu cố định này (luôn luôn là 01010) là một dạng kiểm tra lỗi tích hợp sẵn. Nếu máy quét không tìm thấy mẫu bảo vệ trung tâm nơi mà đáng lẽ ra nó phải ở đó, máy sẽ không xem đây là một mã UPC có thể dịch được. Mẫu bảo vệ trung tâm này là một trong vài phép phòng vệ mã khỏi bị sửa bậy hoặc in sai.

Sau mẫu bảo vệ trung tâm là 6 nhóm 7 bit khác, sau nó là mẫu bảo vệ tay phải, luôn luôn là 101. Mẫu bảo vệ ở cuối này cho phép mã UPC được quét ngược (có nghĩa là từ phải sang trái) cũng như xuôi.

Thế nên toàn bộ UPC mã hóa 12 chữ số. Phần bên trái của UPC mã hóa 6 chữ số, mỗi chữ số cần 7 bit. Bạn có thể dùng bản sau để giải mã những bit này:

       Mã bên trái
0001101 = 0   0110001 = 5
0011001 = 1   0101111 = 6
0010011 = 2   0111011 = 7
0111101 = 3   0110111 = 8
0100011 = 4   0001011 = 9

Chú ý là mỗi mã 7 bit bắt đầu với 1 số không và kết thúc với 1 số 1. Nếu máy quét gặp phải một mã 7 bit ở bên trái bắt đầu với số 1 hoặc kết thúc với số 0, nó biết rằng hoặc nó đã không đọc đúng mã UPC hoặc mã đó đã bị làm giả. Cũng nên chú ý là mỗi mã chỉ có 2 nhóm bit 1 liền kề. Điều này ngầm truyền tải rằng mỗi chữ số tương ứng với 2 vạch dọc trong mã UPC.

Kiểm tra những mã này kỹ hơn, và bạn sẽ phát hiện ra rằng tất cả chúng đều có số lượng bit 1 là 1 số lẻ. Đây cũng là một dạng kiểm lỗi và thống nhất khác, được biết là parity (quy tắc mã hoá). Một nhóm các bit có parity chẵn nếu nó có số bit 1 là chẵn và parity lẻ nếu số bit 1 là lẻ. Do đó tất cả những mã này có parity lẻ.

Để dịch 6 mã 7 bit ở bên phải của UPC, hãy dùng bảng sau:

       Mã bên phải
1110010 = 0   1001110 = 5
1100110 = 1   1010000 = 6
1101100 = 2   1000100 = 7
1000010 = 3   1001000 = 8
1011100 = 4   1110100 = 9

Những mã này ngược lại hay hoàn thiện với những mã trước đó: số 0 trước đó đứng ở vị trí nào thì giờ chỗ đó là 1, và ngược lại. Những mã này luôn luôn bắt đầu với 1 và kết thúc với 0. Hơn nữa, chúng có số bit 1 chẵn, nên là parity chẵn.

Vậy là giờ ta đã được trang bị đầy đủ để giải mã UPC. Sử dụng 2 bảng trước đó, ta có thể xác định 12 chữ số thập phân được mã hóa trong lon súp mì gà Campell's là:

051000012517

Thật là thất vọng. Như bạn có thể thấy, mã số này chính xác là những số đã được in sẵn phía dưới mã UPC. (điều này đúng mà: nếu máy quét không thể đọc mã vì lý do nào đó, người thu ngân có thể nhập những số này bằng tay). Chúng ta đã trải qua nhiều công đoạn thế này không phải chỉ để giải mã những con số và hơn nữa còn chưa hé màn được tí ti bí mật gì. Nhưng lại chẳng còn gì trong mã UPC để mà giải nữa. 30 vạch này dịch ra 12 chữ số. Trong 12 chữ số thập phân này, chữ số đầu tiên (0) được biết đến là ký tự hệ thống số. 0 nghĩa là đây là mã UPC thường. Nếu mã UPC xuất hiện trên các gói thực phẩm có cân nặng biến động như thịt, mã này sẽ là 2. Mã giảm giá được mã hóa là 5.

Đối lập với niềm tin phổ biến, UPC không bao gồm giá của món đồ. Thông tin đó phải được lấy trực tiếp từ máy tính mà cửa hàng dùng kết nối với máy quét tính tiền.

Chữ số cuối cùng (7) Được gọi là ký tự kiểm tra phần dư. Ký tự này lại cho phép 1 dạng kiểm lỗi khác. Bạn có thể thử: gán một chữ cái cho mỗi 11 chữ số trên (0 51000 01251):

ABCDEFGHIJK

Giờ tính biểu thức sau:

3 × (A + C + E + G + I + K) + (B + D + F + H + J)

Rồi lấy bội số của 10 lớn hơn liền kề trừ đi số trên. Trong trường hợp của Súp mì gà Campbell's ta có:

3 × (0 + 1 + 0 + 0 + 2 + 1) + (5 + 0 + 0 + 1 + 5) = 3 × 4 + 11 = 23

Bội số của 10 lớn hơn liền kề là 30 nên:

30 - 23 = 7

Và đó là ký tự kiểm tra phần dư được in và mã hóa trong UPC. Đây là một dạng của tính dư thừa. Nếu máy tính điều khiển máy quét không tính ra được ký tự kiểm tra phần dư giống với thứ được mã hóa trong UPC, máy tính sẽ không chấp nhận UPC hợp lệ.

Thông thường chỉ 4 bit cần để chỉ ra 1 số thập phân từ 0 tới 9. UPC dùng 7 bit cho mỗi chữ số. Tổng quan, UPC dùng 95 bit để mã hóa chỉ 11 chữ số thập phân hữu dụng. Thực tế UPC gồm khoảng trống (tương đương với 9 bit 0) ở cả 2 đầu trái và phải của mẫu bảo vệ. Điều này có nghĩa là toàn bộ UPC cần tới 113 btt để mã hóa 11 chữ số thập phân, hoặc hơn 10 bit cho mỗi chữ số thập phân!

Một phần của sự thừa này lại cần thiết để kiểm lỗi như ta đã thấy. Một mã sản phẩm như trên sẽ không hữu dụng lắm nếu nó lại dễ dàng bị sửa đổi bởi 1 khách hàng dùng đầu bút chì vẽ nguệch ngoạc.

UPC cũng có lợi vì có thể đọc được cả 2 chiều. Nếu những chữ số đầu tiên mà máy quét giải mã có parity chẵn (có nghĩa là số lượng 1 là số chẵn trong mỗi mã 7 bit) máy quét biết rằng nó đang phiên dịch mã UPC từ phải sang trái. Hệ thống máy tính sau đó dùng bảng này để giải mã chữ số bên phải:

Mã bên phải theo chiều ngược lại
0100111 = 0   0111001 = 5
0110011 = 1   0000101 = 6
0011011 = 2   0010001 = 7
0100001 = 3   0001001 = 8
0011101 = 4   0010111 = 9

Và bảng này cho chữ số bên trái:

Mã bên trái theo chiều ngược lại
1011000 = 0   1000110 = 5
1001100 = 1   1111010 = 6
1100100 = 2   1101110 = 7
1011110 = 3   1110110 = 8
1100010 = 4   1101000 = 9

Những mã 7 bit này khác hoàn toàn với những mã được đọc khi UPC quét từ trái sang. Không có gì mù mờ cả.

Một cách để lấy được thêm nhiều thông tin trong một mã quét là chuyển sang 2 chiều. Thay vì một chuỗi gồm những vạch và khoảng trống mỏng hoặc dày ta tạo một lưới các ô vuông đen trắng.

Mã vạch 2 chiều thông dụng nhất có lẽ là mã Quick Response (QR), Được phát triển lần đầu ở Nhật Bản vào năm 1994 và hiện tại được dùng cho rất nhiều mục đích đa dạng.

Tự tạo mã QR thì dễ và không tốn kém. Có một vài website tồn tại chỉ riêng vì mục đích này. Phần mềm cũng có sẵn khả năng quét và giải mã QR thông qua camera trên thiết bị di động. Các máy quét QR chuyên dụng thì sẵn có cho các mục đích công nghiệp ví dụ như theo dõi đơn hàng hay lưu hàng hóa vào kho.

Đây là một mã QR mã hóa URL website cho sách này, CodeHiddenLanguage.com:

image.png 27.8 KB


Nếu bạn có một ứng dụng trên thiết bị di động có thể đọc được mã QR bạn có thể quét ảnh này và chuyển hướng tới website.

Mã QR bao gồm một lưới các ô vuông được gọi là module trong tài liệu chính thức. Mã QR cụ thể này có 25 module theo hàng ngang và dọc tạo thành kích cỡ được gọi là phiên bản 2. Có 40 kích cỡ khác nhau của mã QR được hỗ trợ; phiên bản 40 có 177 module chiều ngang và dọc.

Nếu mỗi khối nhỏ được dịch ra thành bit 0 cho màu trắng và 1 cho màu đen, một lưới của kích cỡ này có tiềm năng mã hóa 25 nhân 25 hay 625 bit. Nhưng khả năng lưu trữ thực tế vào khoảng 1/3 con số đó. Phần lớn thông tin được dùng cho mô hình sửa lỗi tinh vi và phức tạp về mặt toán học. Điều này bảo vệ mã QR khỏi bị làm giả và cũng có thể hỗ trợ phục hồi dữ liệu bị mất do tổn hại. Tôi sẽ không thảo luận nhiều về sửa lỗi mã QR.

Gần như rõ ràng, mã QR cũng chứa một vài mẫu cố định để hỗ trợ máy quét QR dễ dàng định hướng được lưới. Trong hình sau mẫu cố định có màu đen và trắng còn những thứ khác có màu xám:

image.png 31 KB


Ba hình vuông lớn ở các góc được biết là mẫu định vị; hình vuông nhỏ hơn về cạnh dưới bên phải được biết là mẫu căn chỉnh. Những mẫu này hỗ trợ máy đọc mã QR định hướng đúng mã và bù lại cho bất kỳ mất mát nào. Các chuỗi ngang và đứng của các ô trắng đen xen kẽ gần bên trên và bên trái được gọi là mẫu định thời và được dùng để xác định số ô trong mã QR. Ngoài ra mã QR phải được bao quanh toàn bộ bởi một vùng tĩnh đó là một khung trắng rộng gấp 4 lần một ô.

Các chương trình tạo mã QR có vài tùy chọn bao gồm các hệ thống sửa lỗi khác nhau. Thông tin cần cho máy đọc mã QR thực hiện sửa lỗi (cũng như các tác vụ khác) được mã hóa trong 15 bit được gọi là thông tin định dạng. 15 bit này xuất hiện 2 lần trong mã QR. Đây là 15 bit đó được đánh số từ 0 tới 14 nằm bên phải và bên dưới của mẫu định vị phía trên bên trái và lặp lại phía dưới mẫu định vị phía trên bên phải và ở bên phải của mã định vị phía dưới bên trái:

image.png 36.5 KB


Bit được đánh số giống vầy để thể hiện cách chúng tạo thành một giá trị dài hơn. Bit đánh số 0 là bit ít quan trọng nhất và xuất hiện ở bên phải của số. Bit đánh số 14 là bit quan trọng nhất và xuất hiện ở bên trái. Nếu các ô màu trắng là bit 0 và ô màu đen là bit 1 thì đây là toàn bộ số 15 bit:

111001011110011

Tại sao bit 0 là bit ít quan trọng nhất? Bởi vì vị trí của nó trong dãy số đầy đủ tương ứng với 2 mũ không. (xem lại phần đầu trang 109 nếu bạn cần nhắc về cách tạo thành số)

Giá trị số thực tế của 15 bit này không quan trọng bởi vì nó hợp nhất 3 mảnh thông tin. Hai bit quan trọng nhất thể hiện 1 trong 4 cấp độ sửa lỗi. 10 bit ít quan trọng nhất chỉ ra một mã BCH 10 bit được dùng cho sửa lỗi. (BCH là tên viết tắt của nhà phát minh ra kiểu mã này: Bose, Chaudhuri và Hocquenghem. Nhưng tôi đã hứa là sẽ không bàn về sửa lỗi của mã QR rồi mà!)

Ở giữa cấp sửa lỗi 2 bit và mã BCH 10 bit là 3 bit không được dùng cho sửa lỗi. Tôi vừa in đậm 3 bit này để làm nổi bật nó:

111001011110011

Hoá ra máy đọc mã QR hoạt động tốt nhất khi có xấp xỉ một số lượng bằng nhau của ô vuông đen và trắng. Với vài thông tin được mã hoá thì không phải là vấn đề. Chương trình tạo mã QR chịu trách nhiệm chọn  mẫu mặt nạ nhằm cân bằng số lượng ô vuông đen và trắng. Mẫu mặt nạ này được áp dụng vào mã QR để lật các ô được chọn từ trắng thành đen hoặc từ đen thành trắng và do đó kéo theo những bit mà chúng đại diện đổi từ 0 thành 1 và từ 1 thành 0.

Tài liệu của mã QR định nghĩa tám mẫu mặt nạ khác nhau có thể chỉ định cụ thể bởi 8 chuỗi 3 bit 000, 001, 010, 011, 100, 101, 110 và 111. Giá trị trong mã QR mà ta đang xem xét là 100 và nó tương ứng với mẫu mặt nạ tạo từ một chuỗi các đường ngang luân phiên mỗi hàng khác nhau:

image.png 10.5 KB


Mỗi ô trong mã QR ban đầu tương ứng với một vùng trắng trong mặt nạ này vẫn giữ nguyên không đổi. Mỗi ô tương ứng với vùng đen phải được lật từ trắng sang đen hoặc từ đen sang trắng. Chú ý là mặt nạ tránh thay đổi vùng cố định và vùng thông tin QR. Đây là điều xảy ra khi mặt nạ này được áp dụng vào mã QR ban đầu:

image.png 29 KB


Mặt nạ không thay đổi vùng cố định và vùng thông tin. Mặt khác, nếu bạn so sánh ảnh này với mã QR gốc, bạn sẽ thấy rằng hàng trên bị đổi màu, hàng thứ hai như cũ, hàng ba bị đổi và cứ thế.

Giờ ta sẵn sàng bắt đầu đào sâu vào dữ liệu thật. Bắt đầu với 4 bit ở góc dưới bên phải. Trong hình sau, những ô đó được đánh số từ 0 tới 3, với 3 là bit quan trọng nhất và 0 là bit ít quan trọng nhất:

image.png 28.8 KB


4 bit này được biết là chỉ thị kiểu dữ liệu và chúng thể hiện kiểu dữ liệu nào đã được mã hoá trong mã QR. Đây là một vài giá trị khả thi:

Biểu thị Kiểu dữ liệu |           Ý nghĩa
        0001          |            Chỉ số
        0010          |     Chữ cái in hoa và số
        0100          | Văn bản mã hoá thành giá trị 8 bit
        1000          |           Chữ kanji

Giá trị cho mã QR này là 0100, nghĩa là dữ liệu gồm các giá trị 8 bit mã hoá văn bản.

Phần tiếp theo được lưu trong 8 ô ở trên chỉ thị kiểu dữ liệu. 8 bit này được đánh số từ 0 tới 7 trong hình sau:

image.png 29.4 KB


Giá trị này là 00011010, là số thập phân 26. Đó là số kí tự được mã hoá trong mã QR.

Thứ tự của những kí tự này có hệ thống nhưng kì cục. Các kí tự bắt đầu ngay ở trên kí tự đếm. Mỗi kí tự thường - mặc dù không phải luôn - chiếm một vùng rộng 2 ô, cao 4 ô và các kí tự xuôi theo lưới như sau:

image.png 43.3 KB


Không phải tất cả kí tự đều chiếm các vùng rộng 2 ô và cao 4 ô. May mắn thay, tài liệu chính thức của QR khá chính xác về cách các bit xoay khi vùng không vuông góc. Trong ảnh tiếp thao, các ô cho một trong 26 kí tự được viền đỏ và các ô đánh số từ 0 tới 7 với 0 biểu thị bit ít quan trọng nhất và 7 là bit quan trọng nhất:

image.png 88.7 KB


Tài liệu QR thể hiện văn bản đó được mã hoá trong mã QR bằng giá trị 8 bit được định nghĩa theo chuẩn được biết là ISO/IEC 8859. Đó là một thuật ngữ màu mè cho một biến thể của American Standard Code for Information Interchange (ASCII), mà tôi sẽ thảo luận chi tiết hơn trong chương 13.

Kí tự đầu tiên là 01110111, là mã ASCII cho w. Kí tự tiếp theo bên trên tương tự. Kí tự tiếp theo mở rộng sang bên trái nhưng nó cũng là một chữ w. Giờ đi xuống 2 cặp cột tiếp theo. Kí tự kế tiếp là 00101110, là dấu chấm, rồi 01000011, chữ C viết hoa theo sau là 01101111, o. Kí tự tiếp theo nằm trên cặp hàng tiếp. Nó là 01100100: d. Kí tự tiếp bắt đầu bên dưới mẫu căn chỉnh rồi đi lên trên. Mã ASCII cho 01100101 là e. Tiếp tục theo cách này để ra được nội dung www.CodeHiddenLanguage.com.

Thế là xong. Hầu hết những gì còn sót lại trong mã QR chỉ dùng để sửa lỗi.

Mã như UPC và QR trông khá ghê khi mới nhìn lướt qua và có thể bỏ qua cho ai đó cho rằng chúng mang trong người điều gì đó mờ ám (và có khi là xảo quyệt). Nhưng để cho những mã này được dùng rộng rãi chúng phải được tổ chức tài liệu tốt và có sẵn trong cộng đồng. Càng nhiều người dùng thì càng nhiều tiềm năng để chúng trở thành một phần mở rộng cho các phương tiện truyền thông đã đầy ắp của chúng ta.

Bit ở khắp mọi nơi, nhưng ở cuối cuộc thảo luận về mã QR tôi có nhắc tới "giá trị 8 bit". Có một từ đặc biệt cho giá trị 8 bit. Chắc là bạn đã nghe đâu đó rồi.
Cảm ơn bạn đã đọc bài.
6

Open to Work

Looking for a Fullstack Ruby on Rails developer?

I am open to new remote/hybrid opportunities and contract work.

Thảo luận trên Bluesky

Đi

Đang tải bình luận...

Powered by Bluesky AT Protocol