6410729 Add BitSet.previousClearBit, previousSetBit

Martin Buchholz Martin.Buchholz at Sun.COM
Wed Jul 18 08:16:02 UTC 2007


Peter,

Thanks.

I agree that previousClearBit, previousSetBit are worth
adding to BitSet and intend to work on integrating your
contribution soon.

BitSet has not seen a lot of maintenance the past few
years, but I have been involved with most of it.

Martin

Peter B. West wrote:
> I had previously posted about this on the jdk-collaboration list without
> getting any responses.
> 
> Attached is an implementation of BitSet.java which includes the
> previousClearBit and previousSetBit methods. It is in the form of a
> NetBeans project, including JUnit tests. The project is specified in a
> non-java package for testing. All up, there are 73 additional lines of
> code and docs in BitSet.java. No big deal.
> 
> Also attached is a udiff against JDK build 15 of 5th July.
> 
> I have been, on and off, roaming in the wilderness of JDK builds and
> jtreg testing since I first submitted the code on the 6th of May,
> without making much progress, and without getting any response. As far
> as I can tell, I have followed the recommended path for a submission.
> Obviously, there are flaws in either the documentation or the
> implementation.
> 
> I have tried using the NetBeans build facilities to build and test a
> project consisting only of BitSet.java. While I can build it, I don't
> know how to run jtreg against it. I suspect I must have a full JDK
> build, which I have not been able to achieve on my SuSE 10.2 box. Note
> that I haven't actually written a jtreg test yet. I'll do that when I've
> been able to get one to run in the current environment.
> 
> Anyway, what I'm after is some (hopefully simple) set of steps I can
> follow to get this trivial piece of code either accepted or rejected
> for, what, Java 8? Java 9?
> 
> 
> ------------------------------------------------------------------------
> 
> --- openjdk/j2se/src/share/classes/java/util/BitSet.java	2007-07-05 17:49:27.000000000 +1000
> +++ openjdk.mods/j2se/src/share/classes/java/util/BitSet.java	2007-07-18 16:16:59.000000000 +1000
> @@ -593,6 +593,81 @@
>      }
>  
>      /**
> +     * Returns the index of the nearest bit that is set to <code>true</code>
> +     * that occurs on or before the specified starting index. If no such
> +     * bit exists then -1 is returned.
> +     * 
> +     * To iterate over the <code>true</code> bits in a <code>BitSet</code>,
> +     * use the following loop:
> +     * 
> +     * <pre>
> +     * int i = bs.previousSetBit(bs.length);
> +     * while (i >= 0) {
> +     *     // operate on index i here
> +     *     if (--i < 0) {
> +     *          i = bs.previousSetBit(i);
> +     *     }
> +     * }
> +     * 
> +     * @param fromIndex the index to start checking from (inclusive).
> +     * @return the index of the previous set bit.
> +     * @throws IndexOutOfBoundsException if the specified index is negative.
> +     */
> +    public int previousSetBit(int fromIndex) {
> +	if (fromIndex < 0)
> +	    throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex);
> +
> +	checkInvariants();
> +
> +        int u = wordIndex(fromIndex);
> +        if (u >= wordsInUse) {
> +            return length() - 1;
> +        }
> +            
> +        long mask = (WORD_MASK << fromIndex + 1) ^ WORD_MASK;
> +	long word = words[u] & ( mask != 0 ? mask : WORD_MASK );
> +
> +	while (true) {
> +	    if (word != 0)
> +		return (u * BITS_PER_WORD) + BIT_INDEX_MASK - Long.numberOfLeadingZeros(word);
> +	    if (u-- == 0)
> +		return -1;
> +	    word = words[u];
> +	}
> +    }
> +
> +    /**
> +     * Returns the index of the nearest bit that is set to <code>false</code>
> +     * that occurs on or before the specified starting index.
> +     *
> +     * @param   fromIndex the index to start checking from (inclusive).
> +     * @return  the index of the previous clear bit.
> +     * @throws  IndexOutOfBoundsException if the specified index is negative.
> +     */
> +    public int previousClearBit(int fromIndex) {
> +	if (fromIndex < 0)
> +	    throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex);
> +
> +	checkInvariants();
> +
> +        int u = wordIndex(fromIndex);
> +        if (u >= wordsInUse) {
> +            return fromIndex;
> +        }
> +
> +        long mask = (WORD_MASK << fromIndex + 1) ^ WORD_MASK;
> +	long word = ~words[u] & ( mask != 0 ? mask : WORD_MASK );
> +
> +	while (true) {
> +	    if (word != 0)
> +		return (u * BITS_PER_WORD) + BIT_INDEX_MASK - Long.numberOfLeadingZeros(word);
> +	    if (u-- == 0)
> +		return -1;
> +	    word = ~words[u];
> +	}
> +    }
> +
> +    /**
>       * Returns the "logical size" of this <code>BitSet</code>: the index of
>       * the highest set bit in the <code>BitSet</code> plus one. Returns zero
>       * if the <code>BitSet</code> contains no set bits.



More information about the core-libs-dev mailing list