Có cách nào để sử dụng nửa bit không?


19

Như hầu hết mọi người ở đây đều biết, bằng cách sử dụng 4 bit, chúng tôi có thể đếm từ 0 đến 15 (0123456789ABCDEF theo hệ thập lục phân). Nhưng nếu chúng ta chỉ đếm tối đa 9, chúng ta vẫn sẽ sử dụng 4 bit và các chữ số từ A đến F sẽ bị lãng phí.

Tuy nhiên, trang Mã QR của Wikipedia chỉ ra rằng chỉ sử dụng các chữ số từ 0 đến 9 sử dụng 3⅓ bit cho mỗi ký tự, điều này đúng từ quan điểm thống kê. Tuy nhiên, một phần ba bit không phải là một đối tượng vật lý và việc gửi một số từ 0 đến 9 sử dụng ít nhất 4 bit cho kiến ​​thức của tôi.

Có cách nào để sử dụng các kết hợp lãng phí để gửi một ký tự có phân số bit một cách hiệu quả không?

OK, hãy để tôi đưa ra một ví dụ: Phải gửi hai chữ số "27". Với các kỹ thuật mã hóa thông thường, các bit được gửi sẽ là 00100111. Sau đó, chúng ta có thể tưởng tượng một hệ thống sẽ thay thế chữ số '2' bằng chữ số 'E' hoặc 'F', tùy thuộc vào bit tiếp theo; trong trường hợp này, bit tiếp theo là 0, vì vậy '2' được thay thế bằng 'E'. Chuỗi bit kết quả sau đó sẽ là 1101 0 111. Mặt khác, nếu các chữ số "28" phải được gửi, bit đầu tiên sau '2' là 1, do đó, nó được thay thế bằng chữ số 'F' thay vào đó, thu được chuỗi 1111 1 000.

Trong cả hai trường hợp, một nền kinh tế 1 bit đã được thực hiện, bởi vì một nibble đã được sử dụng cho hai nhân vật khác nhau. Nói cách khác, ba bit rưỡi được sử dụng trên mỗi ký tự.


2
Để có góc nhìn khác về việc đóng gói các giá trị trong không gian chữ số nhỏ hơn, hãy xem máy tính Ternary ( en.wikipedia.org/wiki/Ternary_computer ) Nếu nó đủ tốt cho Knuth, thì nó đủ tốt cho tôi!
RLH

3
Vẫn tốt hơn để nhận ra rằng bạn có thể tính toán (10 * first_digit) + second_digitvà mã hóa thành 7 bit, đại diện cho 0 ... 99, với các mã 100-127 còn lại cho những thứ khác. Và thậm chí còn tiết kiệm hơn với 3 chữ số được nén thành 10 bit.
Hot Licks

Để gửi tất cả 100 giá trị khác nhau, cách tốt nhất bạn có thể nhận được là đóng gói thành 7 bit. Nếu bạn có nhiều chữ số, việc đóng gói sẽ hiệu quả hơn. Nếu bạn có ít hơn 64 giá trị để gửi, bạn có thể gửi nó chỉ bằng 6 bit
phuclv

Câu trả lời:


22

Bạn không thể gửi một nửa bit, nhưng bạn có thể đóng gói hai nửa bit một cách hiệu quả trước khi truyền hoặc lưu trữ.

Bạn tự đưa ra một ví dụ, vì vậy bạn thực sự đã trả lời câu hỏi của mình bằng CÓ.

Một cách có thể dễ dàng hơn một chút là mã hóa đơn giản giá trị của hai chữ số thập phân trong 7 bit. (Sắp xếp nhị phân mã hóa nhị phân).


1
Một trường hợp sử dụng tốt để đóng gói các cặp chữ số thành bảy bit là khi truyền các tệp ASCII bao gồm dữ liệu chủ yếu là số. Bất kỳ giá trị byte nào dưới 128 đại diện cho một ký tự ASCII, trong khi 128-227 đại diện cho hai chữ số ASCII. Dễ dàng mã hóa hoặc giải mã và không yêu cầu dữ liệu chứa hầu hết các chữ số (hoặc thậm chí bất kỳ chữ số nào), nhưng có thể nén các chuỗi chữ số bằng 50% rất dễ dàng.
supercat

Hoặc định dạng PDP11 đó đã đóng gói 3 ký tự chữ và số thành 16 bit với một bit dự phòng ...
Brian Drumond

@BrianDrummond: Người ta có thể sử dụng 16 bit để lưu trữ chính xác ba ký tự từ một bộ 40 hoặc tối đa ba từ một bộ 39, nhưng sẽ không có bit dự phòng. Thông thường "chữ và số" sẽ ngụ ý một bộ ít nhất 36, nhưng cách duy nhất sẽ có một chút dự phòng là nếu bộ này được giới hạn ở 32.
supercat

Tôi nghĩ rằng nó là 5 bit / char. Chữ và số được chia thành hai bộ mã, với một ký hiệu dành riêng cho "bộ mã chuyển đổi". Tôi đã sai: en.wikipedia.org/wiki/DEC_Radix-50 Freaky đủ, mặc dù chỉ nhìn thấy nó một đêm khi tôi đã phải giải mã một báo cáo một ai đó đã cho tôi vào ngày 8" mềm, trên một / M hệ thống CP, với chỉ một mờ hồi ức về Z80 asm.
Brian Drumond

19

Bạn có thể sử dụng mã hóa huffman để các số có độ dài bit khác nhau. nếu bạn nhận thức được một chữ số sẽ xảy ra thường xuyên hơn những chữ số khác thì nó sẽ có ích.

ví dụ (với sự xuất hiện như nhau):

0 - 1111

1 - 1110

2 - 110

3 - 101

4 - 100

5 - 011

6 - 010

7 - 001

8 - 000

ví dụ kết thúc để nhận số 1:

Bit đầu tiên xuất hiện và chỉ để lại 0 đến 4 làm tùy chọn.

bit thứ hai xuất hiện và chỉ còn lại 0 đến 2 làm tùy chọn.

bit thứ ba đi vào và để lại 0 đến 1 làm tùy chọn.

bit thứ tư đến và số đến là 1


12

Có lẽ những gì bạn đang tìm kiếm là Mã hóa số học, có thể mã hóa một cách hiệu quả một chuỗi các ký hiệu, mỗi ký hiệu về nguyên tắc có thể yêu cầu một số bit (không nguyên). (mặc dù toàn bộ thông điệp phải là toàn bộ số bit)

Trích dẫn Wikipedia :

Mã hóa số học khác với các dạng mã hóa entropy khác như mã hóa Huffman ở chỗ thay vì tách đầu vào thành các ký hiệu thành phần và thay thế từng mã bằng một mã, mã hóa số học mã hóa toàn bộ thông điệp thành một số duy nhất, một phần n trong đó (0,0 ≤ n < 1,0).


10

Hiện tại, IEEE P754 mới cho số học dấu phẩy động xác định các định dạng thập phân ngoài nhị phân. Một trong những mã hóa đề xuất nhóm các chữ số kỹ thuật số từ 3 thành 10 bit.

mã hóa 0 đến 999 bằng cách sử dụng 10 bit = 1024 mã có thể khá hiệu quả và các chữ số thập phân thường được nhóm theo ba.

Mật độ đóng gói thập phân : http://en.wikipedia.org/wiki/Densely_packed_decimal


Ngay cả khi các chữ số thập phân được nhóm theo ba, ngữ nghĩa dấu phẩy động thập phân chính xác có thể yêu cầu (1) chia tỷ lệ một mantissa bằng sức mạnh không phải của ba trong số mười yêu cầu nhân hoặc chia tất cả các thành phần cho 10 hoặc 100; (2) một số bit có thể được sử dụng cho phần trên hoặc phần dưới của số, tùy thuộc vào (số mũ 3); (3) Nếu số mũ được lưu trữ cơ sở-1000, thì nhóm ba chữ số dưới cùng đôi khi có thể phải được làm tròn đến 10 hoặc 100 gần nhất, thay vì đơn vị gần nhất.
supercat

Cá nhân tôi tin rằng các kiểu như BigDecimalcho nhiều mục đích sẽ hiệu quả hơn nếu mỗi từ giữ 9 chữ số thập phân thay vì 32 bit, nhưng các hành vi làm tròn không nên bị ảnh hưởng bởi việc nhóm chữ số.
supercat

4

Sự tương ứng 1: 1 của nhị phân (hoặc thập lục phân) là nhưng mã hóa một ký hiệu cho các bit. Vì vậy, có, như bạn cho thấy nó là có thể. Một nơi khác được sử dụng là (nhưng hơi khác một chút) là trong mã hóa / giải mã trellis trong các hệ thống truyền thông, trong đó các chuyển đổi bit được giữ xa hơn để dễ dàng giải mã. Và tất nhiên, mã hóa 8b / 10b và 64b / 66b, v.v., v.v.


4

Biểu diễn dữ liệu phụ thuộc vào cách giải thích mà bạn hoặc chương trình của bạn đưa ra.

Ví dụ, chúng tôi có thể gửi '27' dưới dạng các ký tự ASCII 0x3237 = 0b0011001000110111.

xn(x)log2n(x)

x1,x2n(x1),n(x2)log2n(x1)+log2n(x2)log2(n(x1)n(x2))

2log2(10)=24=8log2(1010)=7

Nó luôn phụ thuộc vào ứng dụng, nhưng thông thường khi bạn tham gia các biến như bạn đề xuất, sẽ tốn nhiều sức mạnh tính toán hơn nếu bạn muốn thực hiện các thao tác trên các biến này. Việc thêm và trừ các hoạt động trên các biến 'đã tham gia' phức tạp hơn bình thường và có thể cần nhiều không gian hơn trong phần cứng hoặc gây ra sự chậm trễ lâu hơn.



2

Cách thông thường để đóng gói các giá trị là bằng cách nhân từng giá trị với phạm vi của nó, vì vậy bạn kết thúc với một số lượng lớn mà bạn có thể biểu diễn một cách hiệu quả theo bit. Khi giải nén bạn chia theo phạm vi, phần còn lại là chữ số và kết quả là các chữ số được đóng gói còn lại.

Nếu bạn có 5 giá trị trong phạm vi từ 0 đến 2, bạn có thể biểu thị giá trị đó trong 8 bit (bạn cần ít nhất 7,92 bit để biểu thị các giá trị) thay vì 10 bit được sử dụng theo cách ngây thơ sử dụng 2 bit cho mỗi giá trị, bằng cách làm (((n 1 * 3 + n 2 ) * 3 + n 3 ) * 3 + n 4 ) * 3 + n 5


Có một tên cho phương pháp mã hóa này?
Keegan Jay

1

Về lý thuyết, nếu bạn sẵn sàng dành không gian mạch và nguồn cho bộ phát hiện trở kháng cao, bạn có thể gửi 3 trạng thái xuống một dây kỹ thuật số (1, 0 và Z cao). Disclaimer: điều này hoạt động rất tốt trong trình giả lập. Tôi không biết nếu mạch có một số vấn đề khiến nó không thực tế, như nói rằng nó không thể thực sự chuyển đổi nhanh như một cặp cổng thông thường.

Thuật ngữ bình thường của tôi cho việc chuyển tín hiệu từ tín hiệu Z cao sang tín hiệu (trong đó tín hiệu thường được nối bằng silicon) là tín hiệu nửa bit.


1

Bạn muốn gửi một chữ số thập phân, cần 3⅓ bit. Nhưng bạn sẽ phải sử dụng 4 bit, vì bạn không thể gửi một phần ba bit.

Vì vậy, để tìm hiểu ý nghĩa thực sự của 3⅓ bit, bạn cần hai (hoặc ba) chữ số mỗi bit 3⅓. Nếu bạn muốn gửi 2 (3) chữ số thập phân trong khoảng từ 0 đến 9, mỗi chữ số cần ít hơn 3⅓ bit, bạn có thể làm như vậy bằng cách sử dụng 7 (10) bit. Bằng chứng xây dựng là dễ dàng:

7 (10) bit cho phép bạn mã hóa một số trong khoảng từ 0 đến 128 (1023) - nhưng bạn sẽ chỉ cần 00 (000) đến 99 (999), đó là tất cả các mã hóa có thể có của hai (ba) chữ số thập phân. QED


1

Tôi nghĩ bạn đang hiểu nhầm ý nghĩa của bài viết wiki được liên kết. Có nghĩa là gì là một chuỗi các ký tự là hoàn toàn số (không có khoảng trắng, dấu phẩy, hoặc thời gian), sử dụng nén lý tưởng, bạn có thể đại diện cho mỗi nhân vật sử dụng 3 1 / 3 bit trên trung bình . Trên thực tế, nó tốt hơn một chút so với điều này, vì toán học nói rằng bạn có thể nhận được log 2 (10) = 3,3219 bit / ký tự trong thời gian dài.

Tương tự, đối với tập hợp chữ và số cộng với một số ký hiệu (chỉ chữ hoa và 9 ký hiệu) hoặc 45 ký tự, bạn cần nhật ký 2 (45) = 5,4918 bit / ký tự, được làm tròn đến 5,5 trong bài viết.

Các bit / ký tự giảm được thực hiện bằng cách sử dụng nén, với mã hóa được cài sẵn hoặc sơ đồ nén được chỉ định bởi tiêu chuẩn QR (Tôi không chắc chắn được sử dụng). Nó đại diện cho số bit trung bình mà một ký tự sẽ cần để được mã hóa, do đó, một ký tự riêng lẻ sẽ được mã hóa bằng cách sử dụng nhiều hoặc ít bit. Cũng nhận ra các giá trị được liệt kê ở trên là các giá trị lý tưởng cho các chuỗi ngẫu nhiên, vô hạn. Có thể có được tỷ lệ nén tốt hơn hoặc xấu hơn đối với các chuỗi được chế tạo đặc biệt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.