29 Ocak 2018 Pazartesi

dynamic_bitset Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/dynamic_bitset.hpp>
Eğer serialization ile kullanmak istersek şu satırı dahil ederiz.
#include <boost/dynamic_bitset/serialization.hpp>
Bitleri saklamak için kendi içinde std::vector kullanır.

Template Parametreleri
Şöyledir. Block için açıklama şöyle
It allows you to specify a Block type, which is the underlying primitive used to represent a bunch of bits. You might want to change the block type depending on the platform you're on or depending on how much memory you're willing to use (e.g. a smaller Block type would result in less wasted memory if not all bits are significant).
Ayrıa Allocator verebilme imkanı tanır.
template <typename Block, typename Allocator>
class dynamic_bitset {...}
Parametre Olarak Kullanmak 
dynamic_bitset sınıfını template kullanan metodlara geçmek istersek şöyle yaparız.
template <typename Block, typename Alloc>
void foo(dynamic_bitset<Block, Alloc>& bs) {
  ...
}
Constructor - Length
Şöyle yaparız.
boost::dynamic_bitset<> b (500);
Constructor - Length + Initial Value
Şöyle yaparız.
boost::dynamic_bitset<> b (8, 10); // 8 Bits, value 10
Constructor - iterator
Şöyle yaparız.
std::vector<uint32_t> v = ...;

boost::dynamic_bitset<uint_32_t> b (v.begin(), v.end());
count metodu
Kaç tane 1 bit olduğunu döner. Şöyle yaparız.
boost::dynamic_bitset<> b (500);
...
int c = b.count();
find_first metodu
Atanmış olan ilk biti bulur. Şöyle yaparız.
typedef boost::dynamic_bitset<>::size_type size_type;
const size_type npos = boost::dynamic_bitset<>::npos;
size_type index = b.find_first();
Arama sonucunu kontrol etmek için şöyle yaparız.
if (index != npos) {...}
Arama sonucunu kontrol etmek için şöyle yaparız.
if (index != boost::dynamic_bitset<>::npos) {...}
num_blocks metodu
Şöyle yaparız.
template <typename Ar, typename Block, typename Alloc>
void save(Ar& ar, dynamic_bitset<Block, Alloc> const& bs, unsigned) {
  size_t num_bits = bs.size();
  std::vector<Block> blocks(bs.num_blocks());
  to_block_range(bs, blocks.begin());

  ar & num_bits & blocks;
}
find_next metodu
Atanmış olan ilk biti belirtilen indeksten başlayarak bulur. Şöyle yaparız.
size_type index = ...;
index = b.find_next (index);
operator [] metodu
İmzası şöyle.
reference operator[](size_type pos);
bool operator[](size_type pos) const;
İlk metodu reference döndüğü bir değişkene atamak için şöyle yaparız.
boost::dynamic_bitset<>::reference  operator()(const int pos)
{
    return (*bitset)[pos];
}
operator ^ metodu
Elimizde iki değişken olsun.
boost::dynamic_bitset<> x(500);
boost::dynamic_bitset<> y(500);
Şöyle yaparız. Böylece "Hamming Distance" bulunabilir.
boost::dynamic_bitset<> z(500);
z = x^y;
Hamming Distance için açıklama şöyle
Hamming Distance calculates the distance between two strings, however they have to be of equal length.
İki string için şöyle yaparız.
int HammingDistance(String One, String Two)
{
  if (One.length() != Two.length())
    return -1;

  int counter = 0;

  for (int i = 0; i < One.length(); i++)
  {
    if (One.charAt(i) != Two.charAt(i)) counter++;
  }

  return counter;
}
operator << metodu
Şöyle yaparız.
std::cout << "b = " << b << std::endl; // b = 00001010
resize metodu
Şöyle yaparız.
template <typename Ar, typename Block, typename Alloc>
void load(Ar& ar, dynamic_bitset<Block, Alloc>& bs, unsigned) {
  size_t num_bits;
  std::vector<Block> blocks;
  ar & num_bits & blocks;

  bs.resize(num_bits);
  from_block_range(blocks.begin(), blocks.end(), bs);
  bs.resize(num_bits);
}
to_block_range metodu
Örnek ver

size metodu
Kaç bit uzunluğunda olduğunu belirtir. Şöyle yaparız.
std::cout << "Vector size: " << b.size(); // Vector size : 8

Hiç yorum yok:

Yorum Gönder