C++. Сборник рецептов
Шрифт:
unsigned int n = (sig_x — sig_y);
y <<= n;
// обеспечить правильное число шагов цикла
n += 1;
// удлиненный алгоритм деления со сдвигом и вычитанием
while (n--) {
// сдвинуть частное влево
if (bitsetLtEq(y, r)) {
// добавить новую цифру к частному
q[n] = true;
bitset.Subtract(r, y);
}
//
сдвинуть делитель вправо
y >>= 1;
}
}
Пример 11.37 показывает, как можно использовать заголовочный файл bitset_arithmetic.hpp.
Пример 11.37. Применение функций bitset_arithmetic.hpp
#include "bitset_arithmetic.hpp"
#include <bitset>
#include <iostream>
#include <string>
using namespace std;
int main {
bitset<10> bits1(string("100010001"));
bitset<10> bits2(string("000000011"));
bitsetAdd(bits1, bits2);
cout << bits1.to_string<char, char_traits<char>, allocator<char> > << endl;
}
Программа примера 11.37 выдает следующий результат.
0100010100
Обсуждение
Шаблон класса
bitset
содержит основные операции по манипулированию битовыми наборами, но не обеспечивает арифметические операции и операции сравнения. Это объясняется тем, что в библиотеке нельзя заранее точно предвидеть, какой числовой тип будет использоваться для представления произвольного битового набора согласно ожиданиям программиста. В функциях примера 11.36 считается, что
bitset
представляет собой целый тип без знака, и здесь обеспечиваются операции сложения, вычитания, умножения, деления и сравнения. Эти функции могут составить основу для представления специализированных целочисленных типов, и именно для этого они используются в рецепте 11.20. В примере 11.36 я использовал не самые эффективные алгоритмы. Я применил самые простые алгоритмы, потому что их легче понять. В существенно более эффективной реализации использовались бы аналогичные алгоритмы, которые работали бы со словами, а не с отдельными битами.
Смотри также
Рецепт 11.20.
11.20. Представление больших чисел фиксированного размера
Проблема
Требуется выполнить операции с числами, размер которых превышает размер типа
long int
. Решение
Шаблон
BigInt
в примере 11.38 использует bitset
из заголовочного файла <bitset>
Пример 11.38. big_int.hpp
#ifndef BIG_INT_HPP
#define BIG_INT_HPP
#include <bitset>
#include "bitset_arithmetic.hpp" // Рецепт 11.20
template<unsigned int N>
class BigInt {
typedef BigInt self;
public:
BigInt : bits {}
BigInt(const self& x) : bits(x.bits) {}
BigInt(unsigned long x) {
int n = 0;
while (x) {
bits[n++] = x & 0x1;
x >>= 1;
}
}
explicit BigInt(const std::bitset<N>& x) bits(x) {}
// открытые функции
bool operator[](int n) const { return bits[n]; }
unsigned long toUlong const { return bits.to_ulong; }
// операторы
self& operator<<=(unsigned int n) {
bits <<= n;
return *this;
}
self& operator>>=(unsigned int n) {
bits >>= n;
return *this;
}
self operator++(int) {
self i = *this;
operator++;
return i;
}
self operator--(int) {
self i = *this;
operator--;
return i;
}
self& operator++ {
bool carry = false;
bits[0] = fullAdder(bits[0], 1, carry);
for (int i = 1; i < N; i++) {
bits[i] = fullAdder(bits[i], 0, carry);
}
return *this;
}
self& operator-- {
bool borrow = false;
bits[0] = fullSubtractor(bits[0], 1, borrow);
Поделиться:
Популярные книги
Я не Монте-Кристо
Любовные романы:
современные любовные романы
5.57
рейтинг книги
Офицер-разведки
2. Красноармеец
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Мастер Разума VII
7. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Вперед в прошлое 8
8. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Экономка тайного советника
Фантастика:
фэнтези
5.00
рейтинг книги
Газлайтер. Том 2
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Хозяйка забытой усадьбы
5. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Зубных дел мастер
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крепость над бездной
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Вперед в прошлое 3
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Правильный попаданец
1. Мент
Фантастика:
альтернативная история
5.75