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