3 namespace SevenZip
.Compression
.RangeCoder
10 public BitTreeEncoder(int numBitLevels
)
12 NumBitLevels
= numBitLevels
;
13 Models
= new BitEncoder
[1 << numBitLevels
];
18 for (uint i
= 1; i
< (1 << NumBitLevels
); i
++)
22 public void Encode(Encoder rangeEncoder
, UInt32 symbol
)
25 for (int bitIndex
= NumBitLevels
; bitIndex
> 0; )
28 UInt32 bit
= (symbol
>> bitIndex
) & 1;
29 Models
[m
].Encode(rangeEncoder
, bit
);
34 public void ReverseEncode(Encoder rangeEncoder
, UInt32 symbol
)
37 for (UInt32 i
= 0; i
< NumBitLevels
; i
++)
39 UInt32 bit
= symbol
& 1;
40 Models
[m
].Encode(rangeEncoder
, bit
);
46 public UInt32
GetPrice(UInt32 symbol
)
50 for (int bitIndex
= NumBitLevels
; bitIndex
> 0; )
53 UInt32 bit
= (symbol
>> bitIndex
) & 1;
54 price
+= Models
[m
].GetPrice(bit
);
60 public UInt32
ReverseGetPrice(UInt32 symbol
)
64 for (int i
= NumBitLevels
; i
> 0; i
--)
66 UInt32 bit
= symbol
& 1;
68 price
+= Models
[m
].GetPrice(bit
);
74 public static UInt32
ReverseGetPrice(BitEncoder
[] Models
, UInt32 startIndex
,
75 int NumBitLevels
, UInt32 symbol
)
79 for (int i
= NumBitLevels
; i
> 0; i
--)
81 UInt32 bit
= symbol
& 1;
83 price
+= Models
[startIndex
+ m
].GetPrice(bit
);
89 public static void ReverseEncode(BitEncoder
[] Models
, UInt32 startIndex
,
90 Encoder rangeEncoder
, int NumBitLevels
, UInt32 symbol
)
93 for (int i
= 0; i
< NumBitLevels
; i
++)
95 UInt32 bit
= symbol
& 1;
96 Models
[startIndex
+ m
].Encode(rangeEncoder
, bit
);
103 struct BitTreeDecoder
108 public BitTreeDecoder(int numBitLevels
)
110 NumBitLevels
= numBitLevels
;
111 Models
= new BitDecoder
[1 << numBitLevels
];
116 for (uint i
= 1; i
< (1 << NumBitLevels
); i
++)
120 public uint Decode(RangeCoder
.Decoder rangeDecoder
)
123 for (int bitIndex
= NumBitLevels
; bitIndex
> 0; bitIndex
--)
124 m
= (m
<< 1) + Models
[m
].Decode(rangeDecoder
);
125 return m
- ((uint)1 << NumBitLevels
);
128 public uint ReverseDecode(RangeCoder
.Decoder rangeDecoder
)
132 for (int bitIndex
= 0; bitIndex
< NumBitLevels
; bitIndex
++)
134 uint bit
= Models
[m
].Decode(rangeDecoder
);
137 symbol
|= (bit
<< bitIndex
);
142 public static uint ReverseDecode(BitDecoder
[] Models
, UInt32 startIndex
,
143 RangeCoder
.Decoder rangeDecoder
, int NumBitLevels
)
147 for (int bitIndex
= 0; bitIndex
< NumBitLevels
; bitIndex
++)
149 uint bit
= Models
[startIndex
+ m
].Decode(rangeDecoder
);
152 symbol
|= (bit
<< bitIndex
);