@@ -40,6 +40,7 @@ public void packUnpackBits() {
40
40
input [i ] = value & mask ;
41
41
value += Util .INVERSE_GOLDEN_U64 ;
42
42
}
43
+
43
44
byte [] bytes = new byte [8 * Long .BYTES ];
44
45
int bitOffset = 0 ;
45
46
int bufOffset = 0 ;
@@ -57,6 +58,7 @@ public void packUnpackBits() {
57
58
bufOffset += (bitOffset + bits ) >>> 3 ;
58
59
bitOffset = (bitOffset + bits ) & 7 ;
59
60
}
61
+
60
62
for (int i = 0 ; i < 8 ; ++i ) {
61
63
assertEquals (output [i ], input [i ]);
62
64
}
@@ -76,6 +78,7 @@ public void packUnpackBlocks() {
76
78
input [i ] = value & mask ;
77
79
value += Util .INVERSE_GOLDEN_U64 ;
78
80
}
81
+
79
82
byte [] bytes = new byte [8 * Long .BYTES ];
80
83
BitPacking .packBitsBlock8 (input , 0 , bytes , 0 , bits );
81
84
if (enablePrinting ) { hexDump (bytes ); }
@@ -91,6 +94,68 @@ public void packUnpackBlocks() {
91
94
}
92
95
}
93
96
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
+
94
159
void hexDump (byte [] bytes ) {
95
160
for (int i = 0 ; i < bytes .length ; i ++) {
96
161
System .out .print (String .format ("%02x " , bytes [i ]));
0 commit comments