하프 비트를 사용하는 방법이 있습니까?


19

여기에서 대부분의 사람들이 알고 있듯이 4 비트를 사용하면 0에서 15까지 계산할 수 있습니다 (16 진수의 0123456789ABCDEF). 그러나 우리가 9까지만 계산한다면 여전히 4 비트를 사용하고 A에서 F까지의 숫자가 낭비됩니다.

그러나 Wikipedia의 QR 코드 페이지 에는 0에서 9 사이의 숫자 만 사용하면 문자 당 3⅓ 비트가 사용되며, 이는 통계적 관점에서 올바른 것입니다. 그러나 비트의 3 분의 1은 물리적 객체가 아니며 0에서 9까지의 숫자를 보내는 것은 적어도 4 비트를 사용합니다.

낭비 된 조합을 사용하여 소수의 비트를 가진 문자를 효과적으로 보내는 방법이 있습니까?

자, 예를 들어 보겠습니다. 두 자리 숫자 "27"을 보내야합니다. 정상적인 코딩 기술을 사용하면 전송 된 비트는 00100111이됩니다. 다음 비트에 따라 숫자 '2'를 숫자 'E'또는 'F'로 대체하는 시스템을 상상할 수 있습니다. 이 경우 다음 비트는 0이므로 '2'는 'E'로 바뀝니다. 결과 비트 열은 1101 0 111입니다. 반면에 숫자 "28"을 보내야하는 경우 '2'뒤의 첫 번째 비트가 1이므로 대신 숫자 'F'로 대체됩니다. 문자열 1111 항복 000.

두 경우 모두, 하나의 니블이 두 개의 다른 문자에 사용 되었기 때문에 1 비트의 경제가 적용되었습니다. 다시 말해서, 각 문자에 3 및 1/2 비트가 사용됩니다.


2
더 작은 숫자 공간에 값을 패킹하는 것에 대한 다른 관점을 보려면 Ternary 컴퓨터 ( en.wikipedia.org/wiki/Ternary_computer )를 확인하십시오. Knuth에 충분하다면 나에게 충분합니다!
RLH

3
(10 * first_digit) + second_digit다른 것들을 위해 100-127 코드를 남겨두고 0 ... 99를 나타내는 7 비트로 계산 하고 인코딩 할 수 있음을 여전히 잘 인식하는 것이 좋습니다. 그리고 3 비트를 10 비트로 압축하면 훨씬 더 많은 비용을 절약 할 수 있습니다.
핫 릭

100 개의 서로 다른 값을 모두 보내려면 7 비트로 압축하는 것이 가장 좋습니다. 더 많은 숫자가 있으면 포장이 더 효율적입니다. 보낼 값이 64보다 작 으면 6 비트 만 사용하여 보낼 수 있습니다
phuclv

답변:


22

반 비트를 보낼 수는 없지만 전송 또는 저장하기 전에 반 비트 2 개를 1 비트로 효과적으로 묶을 수 있습니다.

당신은 스스로 모범을 보이므로 YES로 자신의 질문에 효과적으로 대답했습니다.

다소 쉬운 방법은 두 개의 10 진수 값을 7 비트로 간단하게 인코딩하는 것입니다. (이진 코드 이중 십진법의 정렬).


1
숫자 쌍을 7 비트로 패킹하는 좋은 사용법 중 하나는 대부분 숫자 데이터로 구성된 ASCII 파일을 전송할 때입니다. 128 미만의 모든 바이트 값은 단일 ASCII 문자를 나타내고 128-227은 두 개의 ASCII 숫자를 나타냅니다. 인코딩 또는 디코딩이 쉽고 데이터에 대부분 숫자 (또는 숫자)가 포함되어 있지 않아도되지만 숫자 문자열을 50 % 매우 쉽게 압축 할 수 있습니다.
supercat

또는 하나와 16 비트에 3 개 영숫자 포장 PDP11 형식은 ... 예비 비트 있음
브라이언 Drummond는

@BrianDrummond : 16 비트를 사용하여 40 세트에서 정확히 3 자 또는 39 세트에서 최대 3자를 저장할 수 있지만 스페어 비트는 없습니다. 일반적으로 "영숫자"는 최소 36 개의 집합을 의미하지만 여분의 비트가있을 수있는 유일한 방법은 집합이 32로 제한되는 경우입니다.
supercat

나는 그것이 5 비트 / 문자라고 생각했습니다. 영숫자는 "스위치 코드 세트"를 위해 예약 된 하나의 기호와 함께 두 개의 코드 세트로 분할되었습니다. 나는 틀렸다 : en.wikipedia.org/wiki/DEC_Radix-50 Freaky는 충분하지만, 어느 날 밤 누군가가 CP / M 시스템에서 8 인치 플로피로 나에게 준 보고서를 희미하게 보았을 때만 보았습니다. Z80 asm의 회상
Brian Drummond

19

허프만 코딩을 사용하면 숫자의 비트 길이가 다양해집니다. 다른 사람보다 더 자주 발생하는 숫자를 알고 있다면 도움이 될 것입니다.

예 (동일한 발생) :

0-1111

1-1110

2-110

3-101

4-100

5-011

6-010

7-001

8-000

숫자 1을 얻기위한 수신 측 예제 :

첫 번째 비트는 옵션으로 0에서 4까지만 남습니다.

두 번째 비트는 옵션으로 0에서 2까지만 남습니다.

세 번째 비트는 옵션으로 0에서 1로 남습니다.

네 번째 비트가 들어오고 들어오는 숫자는 1입니다.


12

아마도 당신이 찾고있는 것은 산술 코딩이며, 이것은 일련의 심볼을 효율적으로 인코딩 할 수 있으며, 각각은 원칙적으로 정수 (비 정수) 비트 수를 요구할 수 있습니다. (총 메시지는 전체 비트 수 여야 함)

인용 위키 백과 :

산술 코딩은 입력을 구성 요소 기호로 분리하고 각각을 코드로 대체하는 대신 허프만 코딩과 같은 다른 형태의 엔트로피 인코딩과 다릅니다. 1.0).


10

부동 소수점 산술을위한 새로운 IEEE P754는 이제 이진 이외에 10 진수 형식을 정의합니다. 인코딩 중 하나는 디지털 숫자를 3 씩 10 비트로 그룹화하도록 제안합니다.

10 비트 = 1024 개의 가능한 코드를 사용하여 0에서 999까지 인코딩하는 것은 매우 효율적이며, 십진수는 종종 어쨌든 3으로 그룹화됩니다.

밀도가 높은 십진법 : http://en.wikipedia.org/wiki/Densely_packed_decimal


십진수가 세 개로 그룹화되어 있어도, 정확한 십진 부동 소수점 시맨틱은 (1) 10의 3의 배수가 아닌 제곱으로 가수를 스케일링하는 것은 모든 성분을 10 또는 100으로 곱하거나 나누는 것을 수반한다; (2) 일부 비트는 (지수 모드 3)에 따라 숫자의 상위 또는 하위 부분에 사용될 수 있습니다. (3) 지수가 base-1000에 저장된 경우, 세 자리의 최하위 그룹은 때때로 가장 가까운 단위가 아닌 가장 가까운 10 또는 가장 가까운 100으로 반올림되어야 할 수도 있습니다.
supercat

필자는 개인적 BigDecimal으로 각 단어가 32 비트가 아닌 9 개의 10 진수를 보유하면 많은 목적 과 같은 유형 이 더 효율적 이라고 생각 하지만 반올림 동작은 숫자 그룹화의 영향을 받아서는 안됩니다.
supercat

4

이진 (또는 16 진)의 1 : 1 대응은 비트에 대한 하나의 심볼 인코딩입니다. 예, 당신이 보여 주었 듯이 가능합니다. 이것이 사용되는 다른 장소는 (그러나 약간 다르게) 비트 천이가 더 멀리 떨어져있어 디코딩을 용이하게하는 통신 시스템에서 격자 인코딩 / 디코딩에있다. 물론 8b / 10b 및 64b / 66b 등의 인코딩도 비슷한 개념입니다. 더 작은 심볼 공간이 약간 중복되는 더 큰 공간에서 인코딩되어 서브 밴드에서 DC 밸런스, 심볼 분리 및 제어 코드를 얻습니다.


4

데이터 표현은 귀하 또는 귀하의 프로그램이 제공하는 해석에 따라 다릅니다.

'27'을 ASCII 문자로 보낼 수도 있습니다 (예 : yielding) 0x3237 = 0b0011001000110111.

xn(x)log2n(x) 비트가 필요합니다.

이제 두 개의 변수 이 있다고 가정하십시오.x1,x2(엑스1),(엑스2)가능한 값. 따로 보관하면 필요할 것입니다로그2(엑스1)+로그2(엑스2)비트. 그러나 함께 보관하면 필요한 것만로그2((엑스1)(엑스2)) 비트.

두 자리 숫자를 보내는 예제에서 두 자리 숫자는 서로 다른 10 개의 값을 가질 수 있습니다. 따로 보관하면2로그2(10)=24=8비트. 그러나 함께 보관하면로그2(1010)=7 비트.

항상 응용 프로그램에 따라 다르지만 일반적으로 제안한 것처럼 변수에 '가입'할 때 이러한 변수에 대해 작업을 수행하려면 계산 능력이 많이 필요합니다. '결합 된'변수에 대한 연산을 더하거나 빼는 것은 평소보다 더 복잡하며 하드웨어에 더 많은 공간이 필요하거나 더 오래 지연 될 수 있습니다.


노트 : 반올림 표기법입니다 .


2

값을 묶는 일반적인 방법은 각 값에 범위를 곱하는 것이므로 비트로 효율적으로 표현할 수있는 하나의 큰 숫자로 끝납니다. 포장을 풀 때 범위로 나누면 나머지는 숫자이며 결과는 나머지 패킹 된 숫자입니다.

0에서 2까지의 범위에 5 개의 값이있는 경우 각 값에 2 비트를 사용하는 순진한 방법으로 사용되는 10 비트 대신 8 비트 (값을 나타내려면 7.92 비트 이상 필요)로 표시 할 수 있습니다. (((n 1 * 3 + n 2 ) * 3 + n 3 ) * 3 + n 4 ) * 3 + n 5


이 인코딩 방법의 이름이 있습니까?
키건 제이

1

이론적으로 고 임피던스 검출기에 회로 공간과 전력을 소비하려는 경우 3 개의 상태를 디지털 와이어 (1, 0 및 high-Z)로 보낼 수 있습니다. 면책 조항 : 이것은 시뮬레이터에서 훌륭하게 작동합니다. 회로에 실제 게이트 쌍만큼 빠르게 전환 할 수 없다고 말하는 것처럼 회로에 실용적이지 않은 문제가 있는지 모르겠습니다.

high-Z에서 신호 (신호가 일반적으로 실리콘에 접지되어 있음) 로의 신호 전이에 대한 나의 일반적인 용어는 반 비트 신호입니다.


1

3⅓ 비트가 필요한 10 진수 한 자리를 보내려고합니다. 그러나 3 분의 1을 보낼 수 없기 때문에 4 비트를 사용해야합니다.

따라서 3⅓ 비트가 실제로 무엇을 의미하는지 알아 보려면 각각 3⅓ 비트의 2 자리 (또는 3 자리)의 숫자가 필요합니다. 각각 3 비트보다 약간 작은 비트가 필요한 0에서 9 사이의 2 자리 10 진수를 보내려면 7 비트를 사용하면됩니다. 건설적인 증거는 쉽다 :

7 (10) 비트를 사용하면 0에서 128 (1023) 사이의 숫자를 인코딩 할 수 있지만 00 (000)-99 (999) 만 있으면됩니다.이 숫자는 2 자리 3 자리의 가능한 인코딩입니다. QED


1

링크 된 위키 기사의 의미를 오해하고 있다고 생각합니다. 무엇을 의미하는 것은 (공백, 쉼표, 또는 기간없이) 완전히 숫자 인 문자열에 대한 이상적인 압축을 사용하여, 당신은 3 사용하여 각 문자를 표시 할 수 있다는 것입니다 (1) / 3 비트 평균을 . 실제로 수학 에서 장기적으로 로그 2 (10) = 3.3219 비트 / 문자를 얻을 수 있기 때문에 이보다 조금 낫습니다 .

마찬가지로 영숫자 + 일부 기호 (대문자 만 9 기호) 또는 45 문자 세트의 경우 로그 2 (45) = 5.4918 비트 / 문자가 필요하며 기사에서 5.5로 반올림됩니다.

비트 / 캐릭터 감소는 압축을 사용하여 사전 설정 인코딩 또는 QR 표준에 의해 지정된 압축 체계를 사용하여 달성됩니다 (어떤 것이 사용되는지 잘 모르겠습니다). 인코딩하기 위해 문자에 필요한 평균 비트 수를 나타내므로 개별 문자가 더 많거나 적은 비트를 사용하여 인코딩됩니다. 또한 위에 나열된 값은 무한 난수 문자열에 이상적인 값입니다. 특수하게 조작 된 스트링에 대해 압축 비율을 향상시킬 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.