| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- package SevenZip.Compression.RangeCoder;
- import java.io.IOException;
- public class BitTreeEncoder
- {
- short[] Models;
- int NumBitLevels;
-
- public BitTreeEncoder(int numBitLevels)
- {
- NumBitLevels = numBitLevels;
- Models = new short[1 << numBitLevels];
- }
-
- public void Init()
- {
- Decoder.InitBitModels(Models);
- }
-
- public void Encode(Encoder rangeEncoder, int symbol) throws IOException
- {
- int m = 1;
- for (int bitIndex = NumBitLevels; bitIndex != 0; )
- {
- bitIndex--;
- int bit = (symbol >>> bitIndex) & 1;
- rangeEncoder.Encode(Models, m, bit);
- m = (m << 1) | bit;
- }
- }
-
- public void ReverseEncode(Encoder rangeEncoder, int symbol) throws IOException
- {
- int m = 1;
- for (int i = 0; i < NumBitLevels; i++)
- {
- int bit = symbol & 1;
- rangeEncoder.Encode(Models, m, bit);
- m = (m << 1) | bit;
- symbol >>= 1;
- }
- }
-
- public int GetPrice(int symbol)
- {
- int price = 0;
- int m = 1;
- for (int bitIndex = NumBitLevels; bitIndex != 0; )
- {
- bitIndex--;
- int bit = (symbol >>> bitIndex) & 1;
- price += Encoder.GetPrice(Models[m], bit);
- m = (m << 1) + bit;
- }
- return price;
- }
-
- public int ReverseGetPrice(int symbol)
- {
- int price = 0;
- int m = 1;
- for (int i = NumBitLevels; i != 0; i--)
- {
- int bit = symbol & 1;
- symbol >>>= 1;
- price += Encoder.GetPrice(Models[m], bit);
- m = (m << 1) | bit;
- }
- return price;
- }
-
- public static int ReverseGetPrice(short[] Models, int startIndex,
- int NumBitLevels, int symbol)
- {
- int price = 0;
- int m = 1;
- for (int i = NumBitLevels; i != 0; i--)
- {
- int bit = symbol & 1;
- symbol >>>= 1;
- price += Encoder.GetPrice(Models[startIndex + m], bit);
- m = (m << 1) | bit;
- }
- return price;
- }
-
- public static void ReverseEncode(short[] Models, int startIndex,
- Encoder rangeEncoder, int NumBitLevels, int symbol) throws IOException
- {
- int m = 1;
- for (int i = 0; i < NumBitLevels; i++)
- {
- int bit = symbol & 1;
- rangeEncoder.Encode(Models, startIndex + m, bit);
- m = (m << 1) | bit;
- symbol >>= 1;
- }
- }
- }
|