2017-11-19 7 views
1

현재 저는 허프만 디코딩을 기반으로 파일 압축기를 연구 중입니다. , 0 비트를 써, 각 잎은 "스몰 토크에서 비트를 조작하는 방법은 무엇입니까?

: 그래서 디코딩 트리과 같이 있습니다

enter image description here

나는 특정 기준에 따라 출력 파일에이 나무를 인코딩해야 그 다음에 대응하는 문자 인 의 8 비트가 후속된다. 비트 7, 비트 6, ..., 비트 0, 즉 상위 비트부터 순서대로 비트를 기록한다. 특수한 경우로서, 바이트가 0이면, 비트 8은 0의 바이트 값에 대해 0이고, 256의 바이트 값에 대해서는 1입니다 (EOF 마커). " 내부 노드의 경우 비트 1을 작성하면됩니다.

그래서 할 일은 비트 배열을 만들고 해당 비트를 지정된 형식으로 추가하는 것입니다. 문제는 smalltalk에서 숫자를 이진수로 변환하는 방법을 모른다는 것입니다.

예를 들어 첫 번째 리프를 인코딩하려는 경우 01101011과 같은 작업을 수행합니다. 예를 들어 0을 k의 비트 표현으로 처리 한 다음 모든 비트를 배열에 하나씩 추가하려고합니다.

답변

3

정확히 어떤 언어를 사용하고 있는지 알 수는 없지만 일반적으로 Integer 비트에 액세스 할 수 있습니다. 표현이 무한대의 비트 순으로 두 개의 보수로 된 것처럼 모델링됩니다.

2 is ....0000000000010 
1 is ....0000000000001  
0 is ....0000000000000 with infinitely many 0 on the left 
-1 is ....1111111111111 with infinitely many 1 on the left 
-2 is ....1111111111110 

이 그들이 일반적으로 (클래스가 기호를 인코딩) 기호 크기로 구현, 두 보완이 에뮬레이트한다하더라도, 또한 LargeIntegers 마찬가지입니다. BITOR : bitXor :

그럼 당신은 BITAND 작동 할 수 bitInvert bitShift : 및 일부 맛 bitAt는 : 넣어 : 인덱스가 1부터 시작 :

당신은 (인덱스 2 bitAt)와 비트에 액세스 할 수 있습니다 최하위 비트 또는 증가합니다. 누락 된 경우 bitAnd : 및 bitShift :로 구현하십시오.

긍정적 인 경우 높은 비트 (2 비트)의 순위를 요청할 수 있습니다.

이러한 모든 연산은 새로운 정수를 생성해야합니다 (자리 변경은 불가능합니다).

개념적으로 ByteArray는 8 비트 (0에서 255 사이)의 부호없는 정수 컬렉션이므로, 방언에 이미 존재하지 않는 경우 비트 배열을 구현할 수 있습니다. 또는 Integer를 사용할 수는 있지만 크기를 제어 할 수 없으며 무한대로 작동 할 수 없으므로 작업에 사본이 필요합니다.

+1

방언에서 사용할 수 없다면'BitStream'도 구현하는 것이 현명합니다. 그렇지 않니? –

+0

예, BitStream은 특히 인코딩/디코딩에 유용합니다. –