Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/java/util/BitSet.java
38829 views
1
/*
2
* Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package java.util;
27
28
import java.io.*;
29
import java.nio.ByteBuffer;
30
import java.nio.ByteOrder;
31
import java.nio.LongBuffer;
32
import java.util.stream.IntStream;
33
import java.util.stream.StreamSupport;
34
35
/**
36
* This class implements a vector of bits that grows as needed. Each
37
* component of the bit set has a {@code boolean} value. The
38
* bits of a {@code BitSet} are indexed by nonnegative integers.
39
* Individual indexed bits can be examined, set, or cleared. One
40
* {@code BitSet} may be used to modify the contents of another
41
* {@code BitSet} through logical AND, logical inclusive OR, and
42
* logical exclusive OR operations.
43
*
44
* <p>By default, all bits in the set initially have the value
45
* {@code false}.
46
*
47
* <p>Every bit set has a current size, which is the number of bits
48
* of space currently in use by the bit set. Note that the size is
49
* related to the implementation of a bit set, so it may change with
50
* implementation. The length of a bit set relates to logical length
51
* of a bit set and is defined independently of implementation.
52
*
53
* <p>Unless otherwise noted, passing a null parameter to any of the
54
* methods in a {@code BitSet} will result in a
55
* {@code NullPointerException}.
56
*
57
* <p>A {@code BitSet} is not safe for multithreaded use without
58
* external synchronization.
59
*
60
* @author Arthur van Hoff
61
* @author Michael McCloskey
62
* @author Martin Buchholz
63
* @since JDK1.0
64
*/
65
public class BitSet implements Cloneable, java.io.Serializable {
66
/*
67
* BitSets are packed into arrays of "words." Currently a word is
68
* a long, which consists of 64 bits, requiring 6 address bits.
69
* The choice of word size is determined purely by performance concerns.
70
*/
71
private final static int ADDRESS_BITS_PER_WORD = 6;
72
private final static int BITS_PER_WORD = 1 << ADDRESS_BITS_PER_WORD;
73
private final static int BIT_INDEX_MASK = BITS_PER_WORD - 1;
74
75
/* Used to shift left or right for a partial word mask */
76
private static final long WORD_MASK = 0xffffffffffffffffL;
77
78
/**
79
* @serialField bits long[]
80
*
81
* The bits in this BitSet. The ith bit is stored in bits[i/64] at
82
* bit position i % 64 (where bit position 0 refers to the least
83
* significant bit and 63 refers to the most significant bit).
84
*/
85
private static final ObjectStreamField[] serialPersistentFields = {
86
new ObjectStreamField("bits", long[].class),
87
};
88
89
/**
90
* The internal field corresponding to the serialField "bits".
91
*/
92
private long[] words;
93
94
/**
95
* The number of words in the logical size of this BitSet.
96
*/
97
private transient int wordsInUse = 0;
98
99
/**
100
* Whether the size of "words" is user-specified. If so, we assume
101
* the user knows what he's doing and try harder to preserve it.
102
*/
103
private transient boolean sizeIsSticky = false;
104
105
/* use serialVersionUID from JDK 1.0.2 for interoperability */
106
private static final long serialVersionUID = 7997698588986878753L;
107
108
/**
109
* Given a bit index, return word index containing it.
110
*/
111
private static int wordIndex(int bitIndex) {
112
return bitIndex >> ADDRESS_BITS_PER_WORD;
113
}
114
115
/**
116
* Every public method must preserve these invariants.
117
*/
118
private void checkInvariants() {
119
assert(wordsInUse == 0 || words[wordsInUse - 1] != 0);
120
assert(wordsInUse >= 0 && wordsInUse <= words.length);
121
assert(wordsInUse == words.length || words[wordsInUse] == 0);
122
}
123
124
/**
125
* Sets the field wordsInUse to the logical size in words of the bit set.
126
* WARNING:This method assumes that the number of words actually in use is
127
* less than or equal to the current value of wordsInUse!
128
*/
129
private void recalculateWordsInUse() {
130
// Traverse the bitset until a used word is found
131
int i;
132
for (i = wordsInUse-1; i >= 0; i--)
133
if (words[i] != 0)
134
break;
135
136
wordsInUse = i+1; // The new logical size
137
}
138
139
/**
140
* Creates a new bit set. All bits are initially {@code false}.
141
*/
142
public BitSet() {
143
initWords(BITS_PER_WORD);
144
sizeIsSticky = false;
145
}
146
147
/**
148
* Creates a bit set whose initial size is large enough to explicitly
149
* represent bits with indices in the range {@code 0} through
150
* {@code nbits-1}. All bits are initially {@code false}.
151
*
152
* @param nbits the initial size of the bit set
153
* @throws NegativeArraySizeException if the specified initial size
154
* is negative
155
*/
156
public BitSet(int nbits) {
157
// nbits can't be negative; size 0 is OK
158
if (nbits < 0)
159
throw new NegativeArraySizeException("nbits < 0: " + nbits);
160
161
initWords(nbits);
162
sizeIsSticky = true;
163
}
164
165
private void initWords(int nbits) {
166
words = new long[wordIndex(nbits-1) + 1];
167
}
168
169
/**
170
* Creates a bit set using words as the internal representation.
171
* The last word (if there is one) must be non-zero.
172
*/
173
private BitSet(long[] words) {
174
this.words = words;
175
this.wordsInUse = words.length;
176
checkInvariants();
177
}
178
179
/**
180
* Returns a new bit set containing all the bits in the given long array.
181
*
182
* <p>More precisely,
183
* <br>{@code BitSet.valueOf(longs).get(n) == ((longs[n/64] & (1L<<(n%64))) != 0)}
184
* <br>for all {@code n < 64 * longs.length}.
185
*
186
* <p>This method is equivalent to
187
* {@code BitSet.valueOf(LongBuffer.wrap(longs))}.
188
*
189
* @param longs a long array containing a little-endian representation
190
* of a sequence of bits to be used as the initial bits of the
191
* new bit set
192
* @return a {@code BitSet} containing all the bits in the long array
193
* @since 1.7
194
*/
195
public static BitSet valueOf(long[] longs) {
196
int n;
197
for (n = longs.length; n > 0 && longs[n - 1] == 0; n--)
198
;
199
return new BitSet(Arrays.copyOf(longs, n));
200
}
201
202
/**
203
* Returns a new bit set containing all the bits in the given long
204
* buffer between its position and limit.
205
*
206
* <p>More precisely,
207
* <br>{@code BitSet.valueOf(lb).get(n) == ((lb.get(lb.position()+n/64) & (1L<<(n%64))) != 0)}
208
* <br>for all {@code n < 64 * lb.remaining()}.
209
*
210
* <p>The long buffer is not modified by this method, and no
211
* reference to the buffer is retained by the bit set.
212
*
213
* @param lb a long buffer containing a little-endian representation
214
* of a sequence of bits between its position and limit, to be
215
* used as the initial bits of the new bit set
216
* @return a {@code BitSet} containing all the bits in the buffer in the
217
* specified range
218
* @since 1.7
219
*/
220
public static BitSet valueOf(LongBuffer lb) {
221
lb = lb.slice();
222
int n;
223
for (n = lb.remaining(); n > 0 && lb.get(n - 1) == 0; n--)
224
;
225
long[] words = new long[n];
226
lb.get(words);
227
return new BitSet(words);
228
}
229
230
/**
231
* Returns a new bit set containing all the bits in the given byte array.
232
*
233
* <p>More precisely,
234
* <br>{@code BitSet.valueOf(bytes).get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)}
235
* <br>for all {@code n < 8 * bytes.length}.
236
*
237
* <p>This method is equivalent to
238
* {@code BitSet.valueOf(ByteBuffer.wrap(bytes))}.
239
*
240
* @param bytes a byte array containing a little-endian
241
* representation of a sequence of bits to be used as the
242
* initial bits of the new bit set
243
* @return a {@code BitSet} containing all the bits in the byte array
244
* @since 1.7
245
*/
246
public static BitSet valueOf(byte[] bytes) {
247
return BitSet.valueOf(ByteBuffer.wrap(bytes));
248
}
249
250
/**
251
* Returns a new bit set containing all the bits in the given byte
252
* buffer between its position and limit.
253
*
254
* <p>More precisely,
255
* <br>{@code BitSet.valueOf(bb).get(n) == ((bb.get(bb.position()+n/8) & (1<<(n%8))) != 0)}
256
* <br>for all {@code n < 8 * bb.remaining()}.
257
*
258
* <p>The byte buffer is not modified by this method, and no
259
* reference to the buffer is retained by the bit set.
260
*
261
* @param bb a byte buffer containing a little-endian representation
262
* of a sequence of bits between its position and limit, to be
263
* used as the initial bits of the new bit set
264
* @return a {@code BitSet} containing all the bits in the buffer in the
265
* specified range
266
* @since 1.7
267
*/
268
public static BitSet valueOf(ByteBuffer bb) {
269
bb = bb.slice().order(ByteOrder.LITTLE_ENDIAN);
270
int n;
271
for (n = bb.remaining(); n > 0 && bb.get(n - 1) == 0; n--)
272
;
273
long[] words = new long[(n + 7) / 8];
274
bb.limit(n);
275
int i = 0;
276
while (bb.remaining() >= 8)
277
words[i++] = bb.getLong();
278
for (int remaining = bb.remaining(), j = 0; j < remaining; j++)
279
words[i] |= (bb.get() & 0xffL) << (8 * j);
280
return new BitSet(words);
281
}
282
283
/**
284
* Returns a new byte array containing all the bits in this bit set.
285
*
286
* <p>More precisely, if
287
* <br>{@code byte[] bytes = s.toByteArray();}
288
* <br>then {@code bytes.length == (s.length()+7)/8} and
289
* <br>{@code s.get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)}
290
* <br>for all {@code n < 8 * bytes.length}.
291
*
292
* @return a byte array containing a little-endian representation
293
* of all the bits in this bit set
294
* @since 1.7
295
*/
296
public byte[] toByteArray() {
297
int n = wordsInUse;
298
if (n == 0)
299
return new byte[0];
300
int len = 8 * (n-1);
301
for (long x = words[n - 1]; x != 0; x >>>= 8)
302
len++;
303
byte[] bytes = new byte[len];
304
ByteBuffer bb = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
305
for (int i = 0; i < n - 1; i++)
306
bb.putLong(words[i]);
307
for (long x = words[n - 1]; x != 0; x >>>= 8)
308
bb.put((byte) (x & 0xff));
309
return bytes;
310
}
311
312
/**
313
* Returns a new long array containing all the bits in this bit set.
314
*
315
* <p>More precisely, if
316
* <br>{@code long[] longs = s.toLongArray();}
317
* <br>then {@code longs.length == (s.length()+63)/64} and
318
* <br>{@code s.get(n) == ((longs[n/64] & (1L<<(n%64))) != 0)}
319
* <br>for all {@code n < 64 * longs.length}.
320
*
321
* @return a long array containing a little-endian representation
322
* of all the bits in this bit set
323
* @since 1.7
324
*/
325
public long[] toLongArray() {
326
return Arrays.copyOf(words, wordsInUse);
327
}
328
329
/**
330
* Ensures that the BitSet can hold enough words.
331
* @param wordsRequired the minimum acceptable number of words.
332
*/
333
private void ensureCapacity(int wordsRequired) {
334
if (words.length < wordsRequired) {
335
// Allocate larger of doubled size or required size
336
int request = Math.max(2 * words.length, wordsRequired);
337
words = Arrays.copyOf(words, request);
338
sizeIsSticky = false;
339
}
340
}
341
342
/**
343
* Ensures that the BitSet can accommodate a given wordIndex,
344
* temporarily violating the invariants. The caller must
345
* restore the invariants before returning to the user,
346
* possibly using recalculateWordsInUse().
347
* @param wordIndex the index to be accommodated.
348
*/
349
private void expandTo(int wordIndex) {
350
int wordsRequired = wordIndex+1;
351
if (wordsInUse < wordsRequired) {
352
ensureCapacity(wordsRequired);
353
wordsInUse = wordsRequired;
354
}
355
}
356
357
/**
358
* Checks that fromIndex ... toIndex is a valid range of bit indices.
359
*/
360
private static void checkRange(int fromIndex, int toIndex) {
361
if (fromIndex < 0)
362
throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex);
363
if (toIndex < 0)
364
throw new IndexOutOfBoundsException("toIndex < 0: " + toIndex);
365
if (fromIndex > toIndex)
366
throw new IndexOutOfBoundsException("fromIndex: " + fromIndex +
367
" > toIndex: " + toIndex);
368
}
369
370
/**
371
* Sets the bit at the specified index to the complement of its
372
* current value.
373
*
374
* @param bitIndex the index of the bit to flip
375
* @throws IndexOutOfBoundsException if the specified index is negative
376
* @since 1.4
377
*/
378
public void flip(int bitIndex) {
379
if (bitIndex < 0)
380
throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
381
382
int wordIndex = wordIndex(bitIndex);
383
expandTo(wordIndex);
384
385
words[wordIndex] ^= (1L << bitIndex);
386
387
recalculateWordsInUse();
388
checkInvariants();
389
}
390
391
/**
392
* Sets each bit from the specified {@code fromIndex} (inclusive) to the
393
* specified {@code toIndex} (exclusive) to the complement of its current
394
* value.
395
*
396
* @param fromIndex index of the first bit to flip
397
* @param toIndex index after the last bit to flip
398
* @throws IndexOutOfBoundsException if {@code fromIndex} is negative,
399
* or {@code toIndex} is negative, or {@code fromIndex} is
400
* larger than {@code toIndex}
401
* @since 1.4
402
*/
403
public void flip(int fromIndex, int toIndex) {
404
checkRange(fromIndex, toIndex);
405
406
if (fromIndex == toIndex)
407
return;
408
409
int startWordIndex = wordIndex(fromIndex);
410
int endWordIndex = wordIndex(toIndex - 1);
411
expandTo(endWordIndex);
412
413
long firstWordMask = WORD_MASK << fromIndex;
414
long lastWordMask = WORD_MASK >>> -toIndex;
415
if (startWordIndex == endWordIndex) {
416
// Case 1: One word
417
words[startWordIndex] ^= (firstWordMask & lastWordMask);
418
} else {
419
// Case 2: Multiple words
420
// Handle first word
421
words[startWordIndex] ^= firstWordMask;
422
423
// Handle intermediate words, if any
424
for (int i = startWordIndex+1; i < endWordIndex; i++)
425
words[i] ^= WORD_MASK;
426
427
// Handle last word
428
words[endWordIndex] ^= lastWordMask;
429
}
430
431
recalculateWordsInUse();
432
checkInvariants();
433
}
434
435
/**
436
* Sets the bit at the specified index to {@code true}.
437
*
438
* @param bitIndex a bit index
439
* @throws IndexOutOfBoundsException if the specified index is negative
440
* @since JDK1.0
441
*/
442
public void set(int bitIndex) {
443
if (bitIndex < 0)
444
throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
445
446
int wordIndex = wordIndex(bitIndex);
447
expandTo(wordIndex);
448
449
words[wordIndex] |= (1L << bitIndex); // Restores invariants
450
451
checkInvariants();
452
}
453
454
/**
455
* Sets the bit at the specified index to the specified value.
456
*
457
* @param bitIndex a bit index
458
* @param value a boolean value to set
459
* @throws IndexOutOfBoundsException if the specified index is negative
460
* @since 1.4
461
*/
462
public void set(int bitIndex, boolean value) {
463
if (value)
464
set(bitIndex);
465
else
466
clear(bitIndex);
467
}
468
469
/**
470
* Sets the bits from the specified {@code fromIndex} (inclusive) to the
471
* specified {@code toIndex} (exclusive) to {@code true}.
472
*
473
* @param fromIndex index of the first bit to be set
474
* @param toIndex index after the last bit to be set
475
* @throws IndexOutOfBoundsException if {@code fromIndex} is negative,
476
* or {@code toIndex} is negative, or {@code fromIndex} is
477
* larger than {@code toIndex}
478
* @since 1.4
479
*/
480
public void set(int fromIndex, int toIndex) {
481
checkRange(fromIndex, toIndex);
482
483
if (fromIndex == toIndex)
484
return;
485
486
// Increase capacity if necessary
487
int startWordIndex = wordIndex(fromIndex);
488
int endWordIndex = wordIndex(toIndex - 1);
489
expandTo(endWordIndex);
490
491
long firstWordMask = WORD_MASK << fromIndex;
492
long lastWordMask = WORD_MASK >>> -toIndex;
493
if (startWordIndex == endWordIndex) {
494
// Case 1: One word
495
words[startWordIndex] |= (firstWordMask & lastWordMask);
496
} else {
497
// Case 2: Multiple words
498
// Handle first word
499
words[startWordIndex] |= firstWordMask;
500
501
// Handle intermediate words, if any
502
for (int i = startWordIndex+1; i < endWordIndex; i++)
503
words[i] = WORD_MASK;
504
505
// Handle last word (restores invariants)
506
words[endWordIndex] |= lastWordMask;
507
}
508
509
checkInvariants();
510
}
511
512
/**
513
* Sets the bits from the specified {@code fromIndex} (inclusive) to the
514
* specified {@code toIndex} (exclusive) to the specified value.
515
*
516
* @param fromIndex index of the first bit to be set
517
* @param toIndex index after the last bit to be set
518
* @param value value to set the selected bits to
519
* @throws IndexOutOfBoundsException if {@code fromIndex} is negative,
520
* or {@code toIndex} is negative, or {@code fromIndex} is
521
* larger than {@code toIndex}
522
* @since 1.4
523
*/
524
public void set(int fromIndex, int toIndex, boolean value) {
525
if (value)
526
set(fromIndex, toIndex);
527
else
528
clear(fromIndex, toIndex);
529
}
530
531
/**
532
* Sets the bit specified by the index to {@code false}.
533
*
534
* @param bitIndex the index of the bit to be cleared
535
* @throws IndexOutOfBoundsException if the specified index is negative
536
* @since JDK1.0
537
*/
538
public void clear(int bitIndex) {
539
if (bitIndex < 0)
540
throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
541
542
int wordIndex = wordIndex(bitIndex);
543
if (wordIndex >= wordsInUse)
544
return;
545
546
words[wordIndex] &= ~(1L << bitIndex);
547
548
recalculateWordsInUse();
549
checkInvariants();
550
}
551
552
/**
553
* Sets the bits from the specified {@code fromIndex} (inclusive) to the
554
* specified {@code toIndex} (exclusive) to {@code false}.
555
*
556
* @param fromIndex index of the first bit to be cleared
557
* @param toIndex index after the last bit to be cleared
558
* @throws IndexOutOfBoundsException if {@code fromIndex} is negative,
559
* or {@code toIndex} is negative, or {@code fromIndex} is
560
* larger than {@code toIndex}
561
* @since 1.4
562
*/
563
public void clear(int fromIndex, int toIndex) {
564
checkRange(fromIndex, toIndex);
565
566
if (fromIndex == toIndex)
567
return;
568
569
int startWordIndex = wordIndex(fromIndex);
570
if (startWordIndex >= wordsInUse)
571
return;
572
573
int endWordIndex = wordIndex(toIndex - 1);
574
if (endWordIndex >= wordsInUse) {
575
toIndex = length();
576
endWordIndex = wordsInUse - 1;
577
}
578
579
long firstWordMask = WORD_MASK << fromIndex;
580
long lastWordMask = WORD_MASK >>> -toIndex;
581
if (startWordIndex == endWordIndex) {
582
// Case 1: One word
583
words[startWordIndex] &= ~(firstWordMask & lastWordMask);
584
} else {
585
// Case 2: Multiple words
586
// Handle first word
587
words[startWordIndex] &= ~firstWordMask;
588
589
// Handle intermediate words, if any
590
for (int i = startWordIndex+1; i < endWordIndex; i++)
591
words[i] = 0;
592
593
// Handle last word
594
words[endWordIndex] &= ~lastWordMask;
595
}
596
597
recalculateWordsInUse();
598
checkInvariants();
599
}
600
601
/**
602
* Sets all of the bits in this BitSet to {@code false}.
603
*
604
* @since 1.4
605
*/
606
public void clear() {
607
while (wordsInUse > 0)
608
words[--wordsInUse] = 0;
609
}
610
611
/**
612
* Returns the value of the bit with the specified index. The value
613
* is {@code true} if the bit with the index {@code bitIndex}
614
* is currently set in this {@code BitSet}; otherwise, the result
615
* is {@code false}.
616
*
617
* @param bitIndex the bit index
618
* @return the value of the bit with the specified index
619
* @throws IndexOutOfBoundsException if the specified index is negative
620
*/
621
public boolean get(int bitIndex) {
622
if (bitIndex < 0)
623
throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
624
625
checkInvariants();
626
627
int wordIndex = wordIndex(bitIndex);
628
return (wordIndex < wordsInUse)
629
&& ((words[wordIndex] & (1L << bitIndex)) != 0);
630
}
631
632
/**
633
* Returns a new {@code BitSet} composed of bits from this {@code BitSet}
634
* from {@code fromIndex} (inclusive) to {@code toIndex} (exclusive).
635
*
636
* @param fromIndex index of the first bit to include
637
* @param toIndex index after the last bit to include
638
* @return a new {@code BitSet} from a range of this {@code BitSet}
639
* @throws IndexOutOfBoundsException if {@code fromIndex} is negative,
640
* or {@code toIndex} is negative, or {@code fromIndex} is
641
* larger than {@code toIndex}
642
* @since 1.4
643
*/
644
public BitSet get(int fromIndex, int toIndex) {
645
checkRange(fromIndex, toIndex);
646
647
checkInvariants();
648
649
int len = length();
650
651
// If no set bits in range return empty bitset
652
if (len <= fromIndex || fromIndex == toIndex)
653
return new BitSet(0);
654
655
// An optimization
656
if (toIndex > len)
657
toIndex = len;
658
659
BitSet result = new BitSet(toIndex - fromIndex);
660
int targetWords = wordIndex(toIndex - fromIndex - 1) + 1;
661
int sourceIndex = wordIndex(fromIndex);
662
boolean wordAligned = ((fromIndex & BIT_INDEX_MASK) == 0);
663
664
// Process all words but the last word
665
for (int i = 0; i < targetWords - 1; i++, sourceIndex++)
666
result.words[i] = wordAligned ? words[sourceIndex] :
667
(words[sourceIndex] >>> fromIndex) |
668
(words[sourceIndex+1] << -fromIndex);
669
670
// Process the last word
671
long lastWordMask = WORD_MASK >>> -toIndex;
672
result.words[targetWords - 1] =
673
((toIndex-1) & BIT_INDEX_MASK) < (fromIndex & BIT_INDEX_MASK)
674
? /* straddles source words */
675
((words[sourceIndex] >>> fromIndex) |
676
(words[sourceIndex+1] & lastWordMask) << -fromIndex)
677
:
678
((words[sourceIndex] & lastWordMask) >>> fromIndex);
679
680
// Set wordsInUse correctly
681
result.wordsInUse = targetWords;
682
result.recalculateWordsInUse();
683
result.checkInvariants();
684
685
return result;
686
}
687
688
/**
689
* Returns the index of the first bit that is set to {@code true}
690
* that occurs on or after the specified starting index. If no such
691
* bit exists then {@code -1} is returned.
692
*
693
* <p>To iterate over the {@code true} bits in a {@code BitSet},
694
* use the following loop:
695
*
696
* <pre> {@code
697
* for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
698
* // operate on index i here
699
* if (i == Integer.MAX_VALUE) {
700
* break; // or (i+1) would overflow
701
* }
702
* }}</pre>
703
*
704
* @param fromIndex the index to start checking from (inclusive)
705
* @return the index of the next set bit, or {@code -1} if there
706
* is no such bit
707
* @throws IndexOutOfBoundsException if the specified index is negative
708
* @since 1.4
709
*/
710
public int nextSetBit(int fromIndex) {
711
if (fromIndex < 0)
712
throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex);
713
714
checkInvariants();
715
716
int u = wordIndex(fromIndex);
717
if (u >= wordsInUse)
718
return -1;
719
720
long word = words[u] & (WORD_MASK << fromIndex);
721
722
while (true) {
723
if (word != 0)
724
return (u * BITS_PER_WORD) + Long.numberOfTrailingZeros(word);
725
if (++u == wordsInUse)
726
return -1;
727
word = words[u];
728
}
729
}
730
731
/**
732
* Returns the index of the first bit that is set to {@code false}
733
* that occurs on or after the specified starting index.
734
*
735
* @param fromIndex the index to start checking from (inclusive)
736
* @return the index of the next clear bit
737
* @throws IndexOutOfBoundsException if the specified index is negative
738
* @since 1.4
739
*/
740
public int nextClearBit(int fromIndex) {
741
// Neither spec nor implementation handle bitsets of maximal length.
742
// See 4816253.
743
if (fromIndex < 0)
744
throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex);
745
746
checkInvariants();
747
748
int u = wordIndex(fromIndex);
749
if (u >= wordsInUse)
750
return fromIndex;
751
752
long word = ~words[u] & (WORD_MASK << fromIndex);
753
754
while (true) {
755
if (word != 0)
756
return (u * BITS_PER_WORD) + Long.numberOfTrailingZeros(word);
757
if (++u == wordsInUse)
758
return wordsInUse * BITS_PER_WORD;
759
word = ~words[u];
760
}
761
}
762
763
/**
764
* Returns the index of the nearest bit that is set to {@code true}
765
* that occurs on or before the specified starting index.
766
* If no such bit exists, or if {@code -1} is given as the
767
* starting index, then {@code -1} is returned.
768
*
769
* <p>To iterate over the {@code true} bits in a {@code BitSet},
770
* use the following loop:
771
*
772
* <pre> {@code
773
* for (int i = bs.length(); (i = bs.previousSetBit(i-1)) >= 0; ) {
774
* // operate on index i here
775
* }}</pre>
776
*
777
* @param fromIndex the index to start checking from (inclusive)
778
* @return the index of the previous set bit, or {@code -1} if there
779
* is no such bit
780
* @throws IndexOutOfBoundsException if the specified index is less
781
* than {@code -1}
782
* @since 1.7
783
*/
784
public int previousSetBit(int fromIndex) {
785
if (fromIndex < 0) {
786
if (fromIndex == -1)
787
return -1;
788
throw new IndexOutOfBoundsException(
789
"fromIndex < -1: " + fromIndex);
790
}
791
792
checkInvariants();
793
794
int u = wordIndex(fromIndex);
795
if (u >= wordsInUse)
796
return length() - 1;
797
798
long word = words[u] & (WORD_MASK >>> -(fromIndex+1));
799
800
while (true) {
801
if (word != 0)
802
return (u+1) * BITS_PER_WORD - 1 - Long.numberOfLeadingZeros(word);
803
if (u-- == 0)
804
return -1;
805
word = words[u];
806
}
807
}
808
809
/**
810
* Returns the index of the nearest bit that is set to {@code false}
811
* that occurs on or before the specified starting index.
812
* If no such bit exists, or if {@code -1} is given as the
813
* starting index, then {@code -1} is returned.
814
*
815
* @param fromIndex the index to start checking from (inclusive)
816
* @return the index of the previous clear bit, or {@code -1} if there
817
* is no such bit
818
* @throws IndexOutOfBoundsException if the specified index is less
819
* than {@code -1}
820
* @since 1.7
821
*/
822
public int previousClearBit(int fromIndex) {
823
if (fromIndex < 0) {
824
if (fromIndex == -1)
825
return -1;
826
throw new IndexOutOfBoundsException(
827
"fromIndex < -1: " + fromIndex);
828
}
829
830
checkInvariants();
831
832
int u = wordIndex(fromIndex);
833
if (u >= wordsInUse)
834
return fromIndex;
835
836
long word = ~words[u] & (WORD_MASK >>> -(fromIndex+1));
837
838
while (true) {
839
if (word != 0)
840
return (u+1) * BITS_PER_WORD -1 - Long.numberOfLeadingZeros(word);
841
if (u-- == 0)
842
return -1;
843
word = ~words[u];
844
}
845
}
846
847
/**
848
* Returns the "logical size" of this {@code BitSet}: the index of
849
* the highest set bit in the {@code BitSet} plus one. Returns zero
850
* if the {@code BitSet} contains no set bits.
851
*
852
* @return the logical size of this {@code BitSet}
853
* @since 1.2
854
*/
855
public int length() {
856
if (wordsInUse == 0)
857
return 0;
858
859
return BITS_PER_WORD * (wordsInUse - 1) +
860
(BITS_PER_WORD - Long.numberOfLeadingZeros(words[wordsInUse - 1]));
861
}
862
863
/**
864
* Returns true if this {@code BitSet} contains no bits that are set
865
* to {@code true}.
866
*
867
* @return boolean indicating whether this {@code BitSet} is empty
868
* @since 1.4
869
*/
870
public boolean isEmpty() {
871
return wordsInUse == 0;
872
}
873
874
/**
875
* Returns true if the specified {@code BitSet} has any bits set to
876
* {@code true} that are also set to {@code true} in this {@code BitSet}.
877
*
878
* @param set {@code BitSet} to intersect with
879
* @return boolean indicating whether this {@code BitSet} intersects
880
* the specified {@code BitSet}
881
* @since 1.4
882
*/
883
public boolean intersects(BitSet set) {
884
for (int i = Math.min(wordsInUse, set.wordsInUse) - 1; i >= 0; i--)
885
if ((words[i] & set.words[i]) != 0)
886
return true;
887
return false;
888
}
889
890
/**
891
* Returns the number of bits set to {@code true} in this {@code BitSet}.
892
*
893
* @return the number of bits set to {@code true} in this {@code BitSet}
894
* @since 1.4
895
*/
896
public int cardinality() {
897
int sum = 0;
898
for (int i = 0; i < wordsInUse; i++)
899
sum += Long.bitCount(words[i]);
900
return sum;
901
}
902
903
/**
904
* Performs a logical <b>AND</b> of this target bit set with the
905
* argument bit set. This bit set is modified so that each bit in it
906
* has the value {@code true} if and only if it both initially
907
* had the value {@code true} and the corresponding bit in the
908
* bit set argument also had the value {@code true}.
909
*
910
* @param set a bit set
911
*/
912
public void and(BitSet set) {
913
if (this == set)
914
return;
915
916
while (wordsInUse > set.wordsInUse)
917
words[--wordsInUse] = 0;
918
919
// Perform logical AND on words in common
920
for (int i = 0; i < wordsInUse; i++)
921
words[i] &= set.words[i];
922
923
recalculateWordsInUse();
924
checkInvariants();
925
}
926
927
/**
928
* Performs a logical <b>OR</b> of this bit set with the bit set
929
* argument. This bit set is modified so that a bit in it has the
930
* value {@code true} if and only if it either already had the
931
* value {@code true} or the corresponding bit in the bit set
932
* argument has the value {@code true}.
933
*
934
* @param set a bit set
935
*/
936
public void or(BitSet set) {
937
if (this == set)
938
return;
939
940
int wordsInCommon = Math.min(wordsInUse, set.wordsInUse);
941
942
if (wordsInUse < set.wordsInUse) {
943
ensureCapacity(set.wordsInUse);
944
wordsInUse = set.wordsInUse;
945
}
946
947
// Perform logical OR on words in common
948
for (int i = 0; i < wordsInCommon; i++)
949
words[i] |= set.words[i];
950
951
// Copy any remaining words
952
if (wordsInCommon < set.wordsInUse)
953
System.arraycopy(set.words, wordsInCommon,
954
words, wordsInCommon,
955
wordsInUse - wordsInCommon);
956
957
// recalculateWordsInUse() is unnecessary
958
checkInvariants();
959
}
960
961
/**
962
* Performs a logical <b>XOR</b> of this bit set with the bit set
963
* argument. This bit set is modified so that a bit in it has the
964
* value {@code true} if and only if one of the following
965
* statements holds:
966
* <ul>
967
* <li>The bit initially has the value {@code true}, and the
968
* corresponding bit in the argument has the value {@code false}.
969
* <li>The bit initially has the value {@code false}, and the
970
* corresponding bit in the argument has the value {@code true}.
971
* </ul>
972
*
973
* @param set a bit set
974
*/
975
public void xor(BitSet set) {
976
int wordsInCommon = Math.min(wordsInUse, set.wordsInUse);
977
978
if (wordsInUse < set.wordsInUse) {
979
ensureCapacity(set.wordsInUse);
980
wordsInUse = set.wordsInUse;
981
}
982
983
// Perform logical XOR on words in common
984
for (int i = 0; i < wordsInCommon; i++)
985
words[i] ^= set.words[i];
986
987
// Copy any remaining words
988
if (wordsInCommon < set.wordsInUse)
989
System.arraycopy(set.words, wordsInCommon,
990
words, wordsInCommon,
991
set.wordsInUse - wordsInCommon);
992
993
recalculateWordsInUse();
994
checkInvariants();
995
}
996
997
/**
998
* Clears all of the bits in this {@code BitSet} whose corresponding
999
* bit is set in the specified {@code BitSet}.
1000
*
1001
* @param set the {@code BitSet} with which to mask this
1002
* {@code BitSet}
1003
* @since 1.2
1004
*/
1005
public void andNot(BitSet set) {
1006
// Perform logical (a & !b) on words in common
1007
for (int i = Math.min(wordsInUse, set.wordsInUse) - 1; i >= 0; i--)
1008
words[i] &= ~set.words[i];
1009
1010
recalculateWordsInUse();
1011
checkInvariants();
1012
}
1013
1014
/**
1015
* Returns the hash code value for this bit set. The hash code depends
1016
* only on which bits are set within this {@code BitSet}.
1017
*
1018
* <p>The hash code is defined to be the result of the following
1019
* calculation:
1020
* <pre> {@code
1021
* public int hashCode() {
1022
* long h = 1234;
1023
* long[] words = toLongArray();
1024
* for (int i = words.length; --i >= 0; )
1025
* h ^= words[i] * (i + 1);
1026
* return (int)((h >> 32) ^ h);
1027
* }}</pre>
1028
* Note that the hash code changes if the set of bits is altered.
1029
*
1030
* @return the hash code value for this bit set
1031
*/
1032
public int hashCode() {
1033
long h = 1234;
1034
for (int i = wordsInUse; --i >= 0; )
1035
h ^= words[i] * (i + 1);
1036
1037
return (int)((h >> 32) ^ h);
1038
}
1039
1040
/**
1041
* Returns the number of bits of space actually in use by this
1042
* {@code BitSet} to represent bit values.
1043
* The maximum element in the set is the size - 1st element.
1044
*
1045
* @return the number of bits currently in this bit set
1046
*/
1047
public int size() {
1048
return words.length * BITS_PER_WORD;
1049
}
1050
1051
/**
1052
* Compares this object against the specified object.
1053
* The result is {@code true} if and only if the argument is
1054
* not {@code null} and is a {@code Bitset} object that has
1055
* exactly the same set of bits set to {@code true} as this bit
1056
* set. That is, for every nonnegative {@code int} index {@code k},
1057
* <pre>((BitSet)obj).get(k) == this.get(k)</pre>
1058
* must be true. The current sizes of the two bit sets are not compared.
1059
*
1060
* @param obj the object to compare with
1061
* @return {@code true} if the objects are the same;
1062
* {@code false} otherwise
1063
* @see #size()
1064
*/
1065
public boolean equals(Object obj) {
1066
if (!(obj instanceof BitSet))
1067
return false;
1068
if (this == obj)
1069
return true;
1070
1071
BitSet set = (BitSet) obj;
1072
1073
checkInvariants();
1074
set.checkInvariants();
1075
1076
if (wordsInUse != set.wordsInUse)
1077
return false;
1078
1079
// Check words in use by both BitSets
1080
for (int i = 0; i < wordsInUse; i++)
1081
if (words[i] != set.words[i])
1082
return false;
1083
1084
return true;
1085
}
1086
1087
/**
1088
* Cloning this {@code BitSet} produces a new {@code BitSet}
1089
* that is equal to it.
1090
* The clone of the bit set is another bit set that has exactly the
1091
* same bits set to {@code true} as this bit set.
1092
*
1093
* @return a clone of this bit set
1094
* @see #size()
1095
*/
1096
public Object clone() {
1097
if (! sizeIsSticky)
1098
trimToSize();
1099
1100
try {
1101
BitSet result = (BitSet) super.clone();
1102
result.words = words.clone();
1103
result.checkInvariants();
1104
return result;
1105
} catch (CloneNotSupportedException e) {
1106
throw new InternalError(e);
1107
}
1108
}
1109
1110
/**
1111
* Attempts to reduce internal storage used for the bits in this bit set.
1112
* Calling this method may, but is not required to, affect the value
1113
* returned by a subsequent call to the {@link #size()} method.
1114
*/
1115
private void trimToSize() {
1116
if (wordsInUse != words.length) {
1117
words = Arrays.copyOf(words, wordsInUse);
1118
checkInvariants();
1119
}
1120
}
1121
1122
/**
1123
* Save the state of the {@code BitSet} instance to a stream (i.e.,
1124
* serialize it).
1125
*/
1126
private void writeObject(ObjectOutputStream s)
1127
throws IOException {
1128
1129
checkInvariants();
1130
1131
if (! sizeIsSticky)
1132
trimToSize();
1133
1134
ObjectOutputStream.PutField fields = s.putFields();
1135
fields.put("bits", words);
1136
s.writeFields();
1137
}
1138
1139
/**
1140
* Reconstitute the {@code BitSet} instance from a stream (i.e.,
1141
* deserialize it).
1142
*/
1143
private void readObject(ObjectInputStream s)
1144
throws IOException, ClassNotFoundException {
1145
1146
ObjectInputStream.GetField fields = s.readFields();
1147
words = (long[]) fields.get("bits", null);
1148
1149
// Assume maximum length then find real length
1150
// because recalculateWordsInUse assumes maintenance
1151
// or reduction in logical size
1152
wordsInUse = words.length;
1153
recalculateWordsInUse();
1154
sizeIsSticky = (words.length > 0 && words[words.length-1] == 0L); // heuristic
1155
checkInvariants();
1156
}
1157
1158
/**
1159
* Returns a string representation of this bit set. For every index
1160
* for which this {@code BitSet} contains a bit in the set
1161
* state, the decimal representation of that index is included in
1162
* the result. Such indices are listed in order from lowest to
1163
* highest, separated by ",&nbsp;" (a comma and a space) and
1164
* surrounded by braces, resulting in the usual mathematical
1165
* notation for a set of integers.
1166
*
1167
* <p>Example:
1168
* <pre>
1169
* BitSet drPepper = new BitSet();</pre>
1170
* Now {@code drPepper.toString()} returns "{@code {}}".
1171
* <pre>
1172
* drPepper.set(2);</pre>
1173
* Now {@code drPepper.toString()} returns "{@code {2}}".
1174
* <pre>
1175
* drPepper.set(4);
1176
* drPepper.set(10);</pre>
1177
* Now {@code drPepper.toString()} returns "{@code {2, 4, 10}}".
1178
*
1179
* @return a string representation of this bit set
1180
*/
1181
public String toString() {
1182
checkInvariants();
1183
1184
int numBits = (wordsInUse > 128) ?
1185
cardinality() : wordsInUse * BITS_PER_WORD;
1186
StringBuilder b = new StringBuilder(6*numBits + 2);
1187
b.append('{');
1188
1189
int i = nextSetBit(0);
1190
if (i != -1) {
1191
b.append(i);
1192
while (true) {
1193
if (++i < 0) break;
1194
if ((i = nextSetBit(i)) < 0) break;
1195
int endOfRun = nextClearBit(i);
1196
do { b.append(", ").append(i); }
1197
while (++i != endOfRun);
1198
}
1199
}
1200
1201
b.append('}');
1202
return b.toString();
1203
}
1204
1205
/**
1206
* Returns a stream of indices for which this {@code BitSet}
1207
* contains a bit in the set state. The indices are returned
1208
* in order, from lowest to highest. The size of the stream
1209
* is the number of bits in the set state, equal to the value
1210
* returned by the {@link #cardinality()} method.
1211
*
1212
* <p>The bit set must remain constant during the execution of the
1213
* terminal stream operation. Otherwise, the result of the terminal
1214
* stream operation is undefined.
1215
*
1216
* @return a stream of integers representing set indices
1217
* @since 1.8
1218
*/
1219
public IntStream stream() {
1220
class BitSetIterator implements PrimitiveIterator.OfInt {
1221
int next = nextSetBit(0);
1222
1223
@Override
1224
public boolean hasNext() {
1225
return next != -1;
1226
}
1227
1228
@Override
1229
public int nextInt() {
1230
if (next != -1) {
1231
int ret = next;
1232
next = nextSetBit(next+1);
1233
return ret;
1234
} else {
1235
throw new NoSuchElementException();
1236
}
1237
}
1238
}
1239
1240
return StreamSupport.intStream(
1241
() -> Spliterators.spliterator(
1242
new BitSetIterator(), cardinality(),
1243
Spliterator.ORDERED | Spliterator.DISTINCT | Spliterator.SORTED),
1244
Spliterator.SIZED | Spliterator.SUBSIZED |
1245
Spliterator.ORDERED | Spliterator.DISTINCT | Spliterator.SORTED,
1246
false);
1247
}
1248
}
1249
1250