@@ -40,6 +40,7 @@ public void packUnpackBits() {
4040 input [i ] = value & mask ;
4141 value += Util .INVERSE_GOLDEN_U64 ;
4242 }
43+
4344 byte [] bytes = new byte [8 * Long .BYTES ];
4445 int bitOffset = 0 ;
4546 int bufOffset = 0 ;
@@ -57,6 +58,7 @@ public void packUnpackBits() {
5758 bufOffset += (bitOffset + bits ) >>> 3 ;
5859 bitOffset = (bitOffset + bits ) & 7 ;
5960 }
61+
6062 for (int i = 0 ; i < 8 ; ++i ) {
6163 assertEquals (output [i ], input [i ]);
6264 }
@@ -76,6 +78,7 @@ public void packUnpackBlocks() {
7678 input [i ] = value & mask ;
7779 value += Util .INVERSE_GOLDEN_U64 ;
7880 }
81+
7982 byte [] bytes = new byte [8 * Long .BYTES ];
8083 BitPacking .packBitsBlock8 (input , 0 , bytes , 0 , bits );
8184 if (enablePrinting ) { hexDump (bytes ); }
@@ -91,6 +94,68 @@ public void packUnpackBlocks() {
9194 }
9295 }
9396
97+ @ Test
98+ public void packBitsUnpackBlocks () {
99+ long value = 0 ; // arbitrary starting value
100+ for (int n = 0 ; n < 10000 ; n ++) {
101+ for (int bits = 1 ; bits <= 63 ; bits ++) {
102+ final long mask = (1 << bits ) - 1 ;
103+ long [] input = new long [8 ];
104+ for (int i = 0 ; i < 8 ; ++i ) {
105+ input [i ] = value & mask ;
106+ value += Util .INVERSE_GOLDEN_U64 ;
107+ }
108+
109+ byte [] bytes = new byte [8 * Long .BYTES ];
110+ int bitOffset = 0 ;
111+ int bufOffset = 0 ;
112+ for (int i = 0 ; i < 8 ; ++i ) {
113+ BitPacking .packBits (input [i ], bits , bytes , bufOffset , bitOffset );
114+ bufOffset += (bitOffset + bits ) >>> 3 ;
115+ bitOffset = (bitOffset + bits ) & 7 ;
116+ }
117+
118+ long [] output = new long [8 ];
119+ BitPacking .unpackBitsBlock8 (output , 0 , bytes , 0 , bits );
120+
121+ for (int i = 0 ; i < 8 ; ++i ) {
122+ assertEquals (output [i ], input [i ]);
123+ }
124+ }
125+ }
126+ }
127+
128+ @ Test
129+ public void packBlocksUnpackBits () {
130+ long value = 123L ; // arbitrary starting value
131+ for (int n = 0 ; n < 10000 ; n ++) {
132+ for (int bits = 1 ; bits <= 63 ; bits ++) {
133+ final long mask = (1 << bits ) - 1 ;
134+ long [] input = new long [8 ];
135+ for (int i = 0 ; i < 8 ; ++i ) {
136+ input [i ] = value & mask ;
137+ value += Util .INVERSE_GOLDEN_U64 ;
138+ }
139+
140+ byte [] bytes = new byte [8 * Long .BYTES ];
141+ BitPacking .packBitsBlock8 (input , 0 , bytes , 0 , bits );
142+
143+ long [] output = new long [8 ];
144+ int bitOffset = 0 ;
145+ int bufOffset = 0 ;
146+ for (int i = 0 ; i < 8 ; ++i ) {
147+ BitPacking .unpackBits (output , i , bits , bytes , bufOffset , bitOffset );
148+ bufOffset += (bitOffset + bits ) >>> 3 ;
149+ bitOffset = (bitOffset + bits ) & 7 ;
150+ }
151+
152+ for (int i = 0 ; i < 8 ; ++i ) {
153+ assertEquals (output [i ], input [i ]);
154+ }
155+ }
156+ }
157+ }
158+
94159 void hexDump (byte [] bytes ) {
95160 for (int i = 0 ; i < bytes .length ; i ++) {
96161 System .out .print (String .format ("%02x " , bytes [i ]));
0 commit comments