如何划分位集
How can I divide bitsets?
我使用两个位集来存储两个多项式。我想把其中一个除以第二,我想得到除法后的余数。例如,如果我想把它写在纸上:
w1= 110011010000000
w2 = 1111001
101000100
110011010000000 : 1111001
1111001
--1111110
1111001
----1110000
1111001
---100100 = remainder
很少有CPU有像这样的GF(2)除法的内置指令,所以您需要自己用shift和xor来实现它。基本上,你可以像在纸上一样实现它——向上移动除数,直到它的顶部比特与被除数的顶部比特匹配,然后异或,再向下移动,记录每个需要异或的位置作为商的一个比特。如果所有有问题的多项式都适合一个单词,你可以只使用unsigned
整数类型。否则,你需要一些多精度位集类型。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;
}
相关文章:
- 如何将输出数字划分为奇数和偶数
- C++无符号短裤的划分导致 int
- 如何在 C++ 中将数组划分为不同的数组
- 分类还是划分枚举?
- 如何将代码划分为多个.cpp文件 C++.
- 将一系列已排序的元素划分为相邻组
- 在某个位置划分链表
- c++中向量中元素的划分
- 变量和常数的C++划分不起作用
- 如何在C++中划分元组
- 定义整数之间的特殊划分
- 为什么不按默认构造路径划分路径只是在 Visual Studio 中添加尾随分隔符?
- C++ 按非类型参数类型划分的模板专用化
- 划分和乘以STD :: Chrono ::持续时间
- 将数字划分为直到满足条件= 0
- 如果类划分为单独的文件,则不调用默认构造函数
- 疯狂(乘,添加,划分)哈希功能如何起作用
- 为什么 omp 并行部分中的线程不会在其部分上划分?
- 我如何使我的循环转到char*阵列的尽头,并将每个城市都放在链接的列表中(城市被划分为白色的空间)
- 如何将一组二进制树的迭代器划分