我该如何划分位组?

时间:2015-06-27 15:51:41

标签: c++ bitset

我使用两个bitsets来存储两个多项式。我希望他们中的一个被第二分割,我想在分裂后得到余数。例如,如果我愿意在纸上:

w1= 110011010000000
w2 = 1111001

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

1 个答案:

答案 0 :(得分:1)

很少有CPU像这样有内置的GF(2)分区指令,所以你需要自己用shift和xors来实现它。基本上,你完全像在纸面上那样实现它 - 将除数向上移动直到它的最高位与被除数相匹配,然后xor并向下移动,记录每个位置,你需要xor作为商的一点。如果所讨论的所有多项式都适合单个单词,则可以使用unsigned整数类型。否则,您将需要一些multiprecision bitset类型。 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;
}