2012-05-08 6 views
7

У меня есть необходимость в BitSet, который позволяет легко конкатенировать несколько BitSet, создавая новый BitSet. default implementation не имеет такого метода.Java BitSet, который позволяет легко объединить битсоты

Есть ли какая-либо реализация в какой-либо внешней библиотеке, которую любой из вас знает, что позволяет легко конкатенации?

Например, скажем, у меня есть битаррей 11111 и еще один бит 010101. Я хочу, чтобы функциональность была добавлена. Таким образом, после конкатенации это приведет к 11111010101.

+2

Поскольку BitSet не имеет значимого размера или длины (за исключением самого высокого набора бит), это немного трудно понять, что вы имеете в виду с конкатенацией. – jarnbjo

+0

@jarnbjo Я редактировал вопрос. Надеюсь, теперь это имеет смысл. –

+2

Это не «конкатенация». Это левое смещение и OR-ing. Я сомневаюсь, что вы сможете придумать согласованное определение вашей конкатенации. Например, почему в вашем примере наблюдаете один ведущий ноль в '010101' и игнорируете бесконечность других ведущих нулей? – EJP

ответ

3

Ну нет возможности реализовать эту ужасно эффективную (производительность и памяти), так как нет метода левого сдвига.

Что вы можете сделать, это либо использовать очевидный nextSetBit для цикла - медленный, но эффективный с точки зрения памяти.

Предположительно более быстрый способ состоит в том, чтобы использовать toLongArray на одном, скопировать, который правильно переместился в достаточно большой массив, создать битетт из этого и/или с другим. Таким образом, вы не выполняете битбифтинг на отдельных битах, а вместо этого работаете над словарными фрагментами.

1

Это работает для меня:

BitSet concatenate_vectors(BitSet vector_1_in, BitSet vector_2_in) { 
    BitSet vector_1_in_clone = (BitSet)vector_1_in.clone(); 
    BitSet vector_2_in_clone = (BitSet)vector_2_in.clone(); 
    int n = 5;//_desired length of the first (leading) vector 
    int index = -1; 
    while (index < (vector_2_in_clone.length() - 1)) { 
    index = vector_2_in_clone.nextSetBit((index + 1)); 
    vector_1_in_clone.set((index + n)); 
    } 
    return vector_1_in_clone; 
} 

Результат: 11111010101

Смежные вопросы