?? bits.java
字號:
/** * @(#)Bits.java 1.14 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.tools.javac.v8.util;/** * A class for extensible, mutable bit sets. */public class Bits { private static final int wordlen = 32; private static final int wordshift = 5; private static final int wordmask = wordlen - 1; private int[] bits; /** * Construct an initially empty set. */ public Bits() { this(new int[1]); } /** * Construct a set consisting initially of given bit vector. */ public Bits(int[] bits) { super(); this.bits = bits; } /** * Construct a set consisting initially of given range. */ public Bits(int start, int limit) { this(); inclRange(start, limit); } private void sizeTo(int len) { if (bits.length < len) { int[] newbits = new int[len]; System.arraycopy(bits, 0, newbits, 0, bits.length); bits = newbits; } } /** * This set = {}. */ public void clear() { for (int i = 0; i < bits.length; i++) bits[i] = 0; } /** * Return a copy of this set. */ public Bits dup() { int[] newbits = new int[bits.length]; System.arraycopy(bits, 0, newbits, 0, bits.length); return new Bits(newbits); } /** * Include x in this set. */ public void incl(int x) { assert x >= 0; sizeTo((x >>> wordshift) + 1); bits[x >>> wordshift] = bits[x >>> wordshift] | (1 << (x & wordmask)); } /** * Include [start..limit) in this set. */ public void inclRange(int start, int limit) { sizeTo((limit >>> wordshift) + 1); for (int x = start; x < limit; x++) bits[x >>> wordshift] = bits[x >>> wordshift] | (1 << (x & wordmask)); } /** * Exclude x from this set. */ public void excl(int x) { assert x >= 0; sizeTo((x >>> wordshift) + 1); bits[x >>> wordshift] = bits[x >>> wordshift] & ~(1 << (x & wordmask)); } /** * Is x an element of this set? */ public boolean isMember(int x) { return 0 <= x && x < (bits.length << wordshift) && (bits[x >>> wordshift] & (1 << (x & wordmask))) != 0; } /** * this set = this set & xs. */ public Bits andSet(Bits xs) { sizeTo(xs.bits.length); for (int i = 0; i < xs.bits.length; i++) bits[i] = bits[i] & xs.bits[i]; return this; } /** * this set = this set | xs. */ public Bits orSet(Bits xs) { sizeTo(xs.bits.length); for (int i = 0; i < xs.bits.length; i++) bits[i] = bits[i] | xs.bits[i]; return this; } /** * this set = this set \ xs. */ public Bits diffSet(Bits xs) { for (int i = 0; i < bits.length; i++) { if (i < xs.bits.length) { bits[i] = bits[i] & ~xs.bits[i]; } } return this; } /** * this set = this set ^ xs. */ public Bits xorSet(Bits xs) { sizeTo(xs.bits.length); for (int i = 0; i < xs.bits.length; i++) bits[i] = bits[i] ^ xs.bits[i]; return this; } /** * Count trailing zero bits in an int. Algorithm from "Hacker's * Delight" by Henry S. Warren Jr. (figure 5-13) */ private static int trailingZeroBits(int x) { assert wordlen == 32; if (x == 0) return 32; int n = 1; if ((x & 65535) == 0) { n += 16; x >>>= 16; } if ((x & 255) == 0) { n += 8; x >>>= 8; } if ((x & 15) == 0) { n += 4; x >>>= 4; } if ((x & 3) == 0) { n += 2; x >>>= 2; } return n - (x & 1); } /** * Return the index of the least bit position >= x that is set. * If none are set, returns -1. This provides a nice way to iterate * over the members of a bit set: * <pre> * for (int i = bits.nextBit(0); i>=0; i = bits.nextBit(i+1)) ... * </pre> */ public int nextBit(int x) { int windex = x >>> wordshift; if (windex >= bits.length) return -1; int word = bits[windex] & ~((1 << (x & wordmask)) - 1); while (true) { if (word != 0) return (windex << wordshift) + trailingZeroBits(word); windex++; if (windex >= bits.length) return -1; word = bits[windex]; } } /** * a string representation of this set. */ public String toString() { char[] digits = new char[bits.length * wordlen]; for (int i = 0; i < bits.length * wordlen; i++) digits[i] = isMember(i) ? '1' : '0'; return new String(digits); } /** * Test Bits.nextBit(int). */ public static void main(String[] args) { java.util.Random r = new java.util.Random(); Bits bits = new Bits(); int dupCount = 0; for (int i = 0; i < 125; i++) { int k; do { k = r.nextInt(250); } while (bits.isMember(k)) ; System.out.println("adding " + k); bits.incl(k); } int count = 0; for (int i = bits.nextBit(0); i >= 0; i = bits.nextBit(i + 1)) { System.out.println("found " + i); count++; } if (count != 125) throw new Error(); }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -