2015-06-27 16 views
1

Я использую два bitsets для хранения двух полиномов. Я хочу, чтобы один из них был разделен на 2-й, и я хочу получить остаток после деления. Например, если я хотел бы это на бумаге:Как я могу разделить биты?

w1= 110011010000000 
w2 = 1111001 

      101000100 
    110011010000000 : 1111001 
    1111001 
    --1111110 
     1111001 
     ----1110000 
      1111001 
      ---100100 = remainder 
+0

Я не понимаю –

+0

Можете ли вы показать нам код, который вы внедрили? –

+0

Его недостаточно, чтобы разделить на два, мне нужно разделить один многочлен на другой многочлен: std :: bitset <30> a ("110011010000000"); std :: bitset <30> b ("1111001"); и я хочу остаток в std :: bitset <30> c; –

ответ

1

Очень немногие процессоры имеют встроенные инструкции для GF (2) разделение, как это, так что вам нужно реализовать его самостоятельно сдвигами и операцию XOR. В принципе, вы реализуете его точно так же, как вы делали это на бумаге, - сдвигайте делитель до тех пор, пока его верхний бит не сравняется с делителем, затем xor и сдвигом назад, записывая каждую позицию, где вам нужно xor как часть частного. Если все рассматриваемые многочлены совпадают в одном слове, вы можете просто использовать для него целые числа unsigned. В противном случае вам понадобится некоторый тип битового набора multiprecision. Для этого можно использовать C++ std::bitset, несмотря на его проблемы (нет простого способа конвертировать между битами разных размеров, без функций бит-бит).

template<size_t N> int top_bit_set(const bitset<N> &a) { 
    int i; 
    for (i = N-1; i >= 0; i--) 
     if (a.test(i)) break; 
    return i; 
} 


template<size_t N> 
bitset<N> gf2_div(bitset<N> dividend, bitset<N> divisor, bitset<N> &remainder) { 
    bitset<N> quotient(0); 
    int divisor_size = top_bit_set(divisor); 
    if (divisor_size < 0) throw divide_by_zero(); 
    int bit; 
    while ((bit = top_bit_set(dividend)) >= divisor_size) { 
     quotient.set(bit - divisor_size); 
     dividend ^= divisor << (bit - divisor_size); } 
    remainder = dividend; 
    return quotient; 
} 
+0

Извините, я попрошу, и я не понимаю ваши функции. Мне просто нужна одна функция, которая будет принимать два параметра (std :: bitset), содержащие полиномы, и вернет третий бит с остатком. Вот лучший пример: http://s17.postimg.org/9vb29rw8v/kodo.png Я хочу передать два бита и получить один битсет, содержащий остаток –

+0

'gf2_div', что делает это двумя битами в качестве первых двух аргументов , и записывая остаток в третий аргумент. Вы можете игнорировать возвращенный фактор, если вам это неинтересно. –

+0

Большое спасибо. Теперь работает. Была небольшая ошибка, что переменная i была вне области действия, и я получил множество предупреждений и ошибок компилятора. Я также не использовал шаблоны очень часто в прошлом, поэтому эта функция была немного страшной для меня, и я не знал, почему я беру 3 параметра. Теперь все ясно. Большое спасибо. :) –