C++ 如何划分位集?

C++ 如何划分位集?,c++,bitset,C++,Bitset,我用二来存储两个多项式。我想把其中一个除以2,然后得到除法后的余数。例如,如果我想把它写在纸上: w1= 110011010000000 w2 = 1111001 101000100 110011010000000 : 1111001 1111001 --1111110 1111001 ----1110000 1111001 ---100100 = remainder

我用二来存储两个多项式。我想把其中一个除以2,然后得到除法后的余数。例如,如果我想把它写在纸上:

w1= 110011010000000
w2 = 1111001

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

很少有CPU有这样的GF(2)分区的内置指令,所以您需要自己用移位和异或来实现它。基本上,你实现它就像你在纸上做的一样——将除数上移,直到它的顶端与被除数的顶端匹配,然后是xor,再下移,将每个需要xor的位置记录为商的一位。如果所讨论的所有多项式都适合于一个单词,则可以对其使用
无符号
整数类型。否则,您将需要一些多精度位集类型。C++的代码> STD::BITSET 可以用于此,尽管存在问题(在不同大小的位集之间没有简单的转换方法,没有BITSCAN函数)。
template int-top\u-bit\u集(常量位集&a){
int i;
对于(i=N-1;i>=0;i--)
如果(a.试验(i))破裂;
返回i;
}
模板
位集gf2_div(位集被除数、位集除数、位集和余数){
位集商(0);
整数除数\大小=顶级位\集(除数);
如果(除数_size<0)抛出除数_除以_零();
整数位;
而((位=顶部位集(被除数))>=除数大小){
商集(位除数大小);

除数^=除数你能给我们看看你实现的代码吗?它不足以除以二,我需要用一个多项式除以另一个多项式:std::位集a(“110011010000000”);std::位集b(“1111001”);我想要std::bitset c中的余数;抱歉,原来我误读了你的问题。但是你真的应该花一些时间来阅读,特别是名为和的部分。还有,请。你可能还想学习如何创建。抱歉,我是begginer,我不理解你的函数。我只需要一个包含两个参数的函数(标准::位集)包含多项式并将返回带余数的第三个位集。下面是一个更好的示例:我想传递两个位集,然后得到一个包含余数的位集
gf2_div
,将这两个位集作为其前两个参数,并将余数写入第三个参数。如果您不在意,可以忽略返回的商。非常感谢。现在可以工作了。有一个小错误,变量我超出了范围,我收到了很多编译器警告和错误。我过去也不经常使用模板,所以这个函数对我来说有点吓人,我不知道为什么我需要3个参数。现在一切都清楚了。再次感谢。:)
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;
}