BitTreeEncoder.java 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package SevenZip.Compression.RangeCoder;
  2. import java.io.IOException;
  3. public class BitTreeEncoder
  4. {
  5. short[] Models;
  6. int NumBitLevels;
  7. public BitTreeEncoder(int numBitLevels)
  8. {
  9. NumBitLevels = numBitLevels;
  10. Models = new short[1 << numBitLevels];
  11. }
  12. public void Init()
  13. {
  14. Decoder.InitBitModels(Models);
  15. }
  16. public void Encode(Encoder rangeEncoder, int symbol) throws IOException
  17. {
  18. int m = 1;
  19. for (int bitIndex = NumBitLevels; bitIndex != 0; )
  20. {
  21. bitIndex--;
  22. int bit = (symbol >>> bitIndex) & 1;
  23. rangeEncoder.Encode(Models, m, bit);
  24. m = (m << 1) | bit;
  25. }
  26. }
  27. public void ReverseEncode(Encoder rangeEncoder, int symbol) throws IOException
  28. {
  29. int m = 1;
  30. for (int i = 0; i < NumBitLevels; i++)
  31. {
  32. int bit = symbol & 1;
  33. rangeEncoder.Encode(Models, m, bit);
  34. m = (m << 1) | bit;
  35. symbol >>= 1;
  36. }
  37. }
  38. public int GetPrice(int symbol)
  39. {
  40. int price = 0;
  41. int m = 1;
  42. for (int bitIndex = NumBitLevels; bitIndex != 0; )
  43. {
  44. bitIndex--;
  45. int bit = (symbol >>> bitIndex) & 1;
  46. price += Encoder.GetPrice(Models[m], bit);
  47. m = (m << 1) + bit;
  48. }
  49. return price;
  50. }
  51. public int ReverseGetPrice(int symbol)
  52. {
  53. int price = 0;
  54. int m = 1;
  55. for (int i = NumBitLevels; i != 0; i--)
  56. {
  57. int bit = symbol & 1;
  58. symbol >>>= 1;
  59. price += Encoder.GetPrice(Models[m], bit);
  60. m = (m << 1) | bit;
  61. }
  62. return price;
  63. }
  64. public static int ReverseGetPrice(short[] Models, int startIndex,
  65. int NumBitLevels, int symbol)
  66. {
  67. int price = 0;
  68. int m = 1;
  69. for (int i = NumBitLevels; i != 0; i--)
  70. {
  71. int bit = symbol & 1;
  72. symbol >>>= 1;
  73. price += Encoder.GetPrice(Models[startIndex + m], bit);
  74. m = (m << 1) | bit;
  75. }
  76. return price;
  77. }
  78. public static void ReverseEncode(short[] Models, int startIndex,
  79. Encoder rangeEncoder, int NumBitLevels, int symbol) throws IOException
  80. {
  81. int m = 1;
  82. for (int i = 0; i < NumBitLevels; i++)
  83. {
  84. int bit = symbol & 1;
  85. rangeEncoder.Encode(Models, startIndex + m, bit);
  86. m = (m << 1) | bit;
  87. symbol >>= 1;
  88. }
  89. }
  90. }