Si tengo un número entero en el que me gustaría realizar la manipulación de bits, ¿cómo puedo cargarlo en un java.util.BitSet
? ¿Cómo puedo convertirlo de nuevo a int o long? No estoy tan preocupado por el tamaño del BitSet
- siempre será de 32 o 64 bits de longitud. Solo me gustaría utilizar los métodos set()
, clear()
, nextSetBit()
y nextClearBit()
en lugar de los operadores bit a bit, pero no puedo encontrar una manera fácil de inicializar un conjunto de bits con un tipo numérico.BitSet hacia y desde entero/largo
Respuesta
El siguiente código crea un conjunto de bits de un valor de largo y viceversa:
public class Bits {
public static BitSet convert(long value) {
BitSet bits = new BitSet();
int index = 0;
while (value != 0L) {
if (value % 2L != 0) {
bits.set(index);
}
++index;
value = value >>> 1;
}
return bits;
}
public static long convert(BitSet bits) {
long value = 0L;
for (int i = 0; i < bits.length(); ++i) {
value += bits.get(i) ? (1L << i) : 0L;
}
return value;
}
}
EDITADO: Ahora ambas direcciones, @leftbrain: de causa, usted tiene razón
Creo que la línea (valor% 1L! = 0) debe ser (valor% 2L! = 0) –
'if (value & 1! = 0)' porque queremos verificar si el bit 0 está establecido, '%' es operador de módulo, y 'siempre es 0 ya que todos los números son divisibles por 1 – ithkuil
FYI, esto está creando un conjunto de bits en orden little-endian –
¿No es el método public void set(int bit)
lo que buscas?
Eso establece un solo bit con el índice que usted proporciona. Me gustaría establecer cada bit que se establece en el entero. – ataylor
Java 7 tiene BitSet.valueOf(byte[])
y BitSet.toByteArray()
Si usted está atascado con Java 6 o anterior, puede utilizar BigInteger
si no es probable que sea un cuello de botella - que tiene getLowestSetBit
, setBit
y clearBit
métodos (los dos últimos creará un nuevo BigInteger
en lugar de modificar en el lugar.)
Agregar a finnw Respuesta: Hay también BitSet.valueOf(long[])
y BitSet.toLongArray()
. Por lo tanto:
int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
long l = bs.toLongArray()[0];
Más o menos directamente de la documentación de nextSetBit
value=0;
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
value += (1 << i)
}
Esto no funcionará para un BitSet mayor de 32 o 64 bits, en tal caso deberá manejar un 'int []' o 'long []' en la salida. Pero a OP explícitamente no le importa, es lo suficientemente justo. Solo unos pocos fallos técnicos menores: en caso de una larga, debe '1L << i', para evitar el desbordamiento, y un OR como' valor | = 1L << i' es suficiente. – charlie
Para obtener una long
volver de un pequeñaBitSet
en un 'streamy' manera :
long l = bitSet.stream()
.takeWhile(i -> i < Long.SIZE)
.mapToLong(i -> 1L << i)
.reduce(0, (a, b) -> a | b);
Viceversa:
BitSet bitSet = IntStream.range(0, Long.SIZE - 1)
.filter(i -> 0 != (l & 1L << i))
.collect(BitSet::new, BitSet::set, BitSet::or);
N.B .: Usar BitSet::valueOf
y BitSet::toLongArray
es, por supuesto, más fácil.
- 1. Codificando cadenas hacia y desde base-64
- 2. Bitset Referencia
- 3. Desordenada (hash) map from bitset to bitset on boost
- 4. Java BitSet Ejemplo
- 5. Bit campo vs Bitset
- 6. Convierte BitSet a int
- 7. transmisión de video hacia y desde múltiples fuentes
- 8. Cómo lanzar bloques hacia y desde el vacío *
- 9. en la conversión hacia y desde el calendario hindú
- 10. python - Leer archivo desde y hacia líneas de texto específicas
- 11. Asignación de Mongodb ObjectId hacia y desde la cadena automáticamente
- 12. Pasar matrices asociativas de PHP hacia y desde XML
- 13. usando recipiente bitset en C++
- 14. Avanzando hacia Ruby on Rails desde ASP.NET
- 15. geocodificación hacia adelante desde el iPhone
- 16. binario serialización de std :: bitset
- 17. De/Serialize directamente Hacia/desde XML Linq
- 18. Cómo redirigir desde www.dominio.com hacia domain.com?
- 19. Convertir un byte o int a BitSet
- 20. Desplazar una animación jQuery hacia atrás y hacia adelante
- 21. Git: Cómo moverse hacia atrás y hacia adelante entre confirmaciones
- 22. jQuery: deslice hacia la izquierda y deslice hacia la derecha
- 23. Gramática: ¿diferencia entre arriba hacia abajo y hacia abajo? (Ejemplo)
- 24. Administrar hacia adelante y hacia atrás en Richfaces
- 25. Encadenamiento hacia adelante y encadenamiento hacia atrás en Java
- 26. Scala y referencias hacia delante
- 27. Estoy ejecutando una aplicación desde un archivo .bat. ¿Cómo hago que la ventana se desplace hacia arriba y hacia abajo?
- 28. Convertir matriz de bytes en Bitset
- 29. Concatenate boost :: dynamic_bitset o std :: bitset
- 30. cómo leer y escribir números flotantes desde y hacia archivos binarios?
Personalmente, diría que la manipulación de bits sin formato es el camino a seguir aquí. Realmente no es tan complicado, y como dices, no veo una manera simple de obtener un int o long en un BitSet. –