1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.util;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
2099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Utilities for treating {@code int[]}s as bit sets.
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class Bits {
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This class is uninstantiable.
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private Bits() {
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // This space intentionally left blank.
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a bit set to contain bits up to the given index (exclusive).
32de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
3399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param max {@code >= 0;} the maximum bit index (exclusive)
3499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} an appropriately-constructed instance
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static int[] makeBitSet(int max) {
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int size = (max + 0x1f) >> 5;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new int[size];
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the maximum index (exclusive) for the given bit set.
43de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
4499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param bits {@code non-null;} bit set in question
4599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code >= 0;} the maximum index (exclusive) that may be set
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static int getMax(int[] bits) {
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return bits.length * 0x20;
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the value of the bit at the given index.
53de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
5499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param bits {@code non-null;} bit set to operate on
5599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param idx {@code >= 0, < getMax(set);} which bit
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the indicated bit
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static boolean get(int[] bits, int idx) {
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int arrayIdx = idx >> 5;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int bit = 1 << (idx & 0x1f);
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (bits[arrayIdx] & bit) != 0;
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the given bit to the given value.
66de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
6799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param bits {@code non-null;} bit set to operate on
6899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param idx {@code >= 0, < getMax(set);} which bit
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value the new value for the bit
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void set(int[] bits, int idx, boolean value) {
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int arrayIdx = idx >> 5;
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int bit = 1 << (idx & 0x1f);
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value) {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bits[arrayIdx] |= bit;
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bits[arrayIdx] &= ~bit;
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
8399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Sets the given bit to {@code true}.
84de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
8599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param bits {@code non-null;} bit set to operate on
8699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param idx {@code >= 0, < getMax(set);} which bit
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void set(int[] bits, int idx) {
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int arrayIdx = idx >> 5;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int bit = 1 << (idx & 0x1f);
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bits[arrayIdx] |= bit;
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
9599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Sets the given bit to {@code false}.
96de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
9799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param bits {@code non-null;} bit set to operate on
9899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param idx {@code >= 0, < getMax(set);} which bit
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void clear(int[] bits, int idx) {
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int arrayIdx = idx >> 5;
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int bit = 1 << (idx & 0x1f);
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bits[arrayIdx] &= ~bit;
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns whether or not the given bit set is empty, that is, whether
10899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * no bit is set to {@code true}.
109de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
11099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param bits {@code non-null;} bit set to operate on
11199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code true} iff all bits are {@code false}
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static boolean isEmpty(int[] bits) {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int len = bits.length;
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < len; i++) {
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (bits[i] != 0) {
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return false;
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return true;
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
12699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Gets the number of bits set to {@code true} in the given bit set.
127de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
12899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param bits {@code non-null;} bit set to operate on
12999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code >= 0;} the bit count (aka population count) of the set
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static int bitCount(int[] bits) {
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int len = bits.length;
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int count = 0;
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < len; i++) {
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            count += Integer.bitCount(bits[i]);
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return count;
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
14399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Returns whether any bits are set to {@code true} in the
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specified range.
145de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
14699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param bits {@code non-null;} bit set to operate on
14799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param start {@code >= 0;} index of the first bit in the range (inclusive)
14899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param end {@code >= 0;} index of the last bit in the range (exclusive)
14999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code true} if any bit is set to {@code true} in
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the indicated range
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static boolean anyInRange(int[] bits, int start, int end) {
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int idx = findFirst(bits, start);
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (idx >= 0) && (idx < end);
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Finds the lowest-order bit set at or after the given index in the
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * given bit set.
160de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
16199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param bits {@code non-null;} bit set to operate on
16299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param idx {@code >= 0;} minimum index to return
16399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code >= -1;} lowest-order bit set at or after {@code idx},
16499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * or {@code -1} if there is no appropriate bit index to return
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static int findFirst(int[] bits, int idx) {
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int len = bits.length;
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int minBit = idx & 0x1f;
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int arrayIdx = idx >> 5; arrayIdx < len; arrayIdx++) {
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int word = bits[arrayIdx];
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (word != 0) {
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int bitIdx = findFirst(word, minBit);
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (bitIdx >= 0) {
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return (arrayIdx << 5) + bitIdx;
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            minBit = 0;
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return -1;
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Finds the lowest-order bit set at or after the given index in the
18699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * given {@code int}.
187de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value the value in question
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param idx 0..31 the minimum bit index to return
19099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code >= -1;} lowest-order bit set at or after {@code idx},
19199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * or {@code -1} if there is no appropriate bit index to return
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static int findFirst(int value, int idx) {
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        value &= ~((1 << idx) - 1); // Mask off too-low bits.
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int result = Integer.numberOfTrailingZeros(value);
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (result == 32) ? -1 : result;
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
20099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Ors bit array {@code b} into bit array {@code a}.
20199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code a.length} must be greater than or equal to
20299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code b.length}.
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
20499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param a {@code non-null;} int array to be ored with other argument. This
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * argument is modified.
20699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param b {@code non-null;} int array to be ored into {@code a}. This
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * argument is not modified.
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void or(int[] a, int[] b) {
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < b.length; i++) {
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a[i] |= b[i];
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static String toHuman(int[] bits) {
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuilder sb = new StringBuilder();
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean needsComma = false;
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append('{');
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int bitsLength = 32 * bits.length;
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < bitsLength; i++) {
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (Bits.get(bits, i)) {
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (needsComma) {
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sb.append(',');
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                needsComma = true;
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(i);
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append('}');
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sb.toString();
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
237