Здравствуйте, Dj.ValDen, Вы писали:
DV>есть std::bitset<128> bst;
DV>есть void *p; который указывает на 128 бит информации в памяти, которую требуется поместить в bst.
DV>Именно это у меня и не получается
Насколько я знаю, у std::bitset<> есть конструктор bitset(unsighned long). Таким образом, я думаю, можно
сделать так
typedef unsigned long ulong;
ulong* i = static_cast<ulong*>(p);
bitset<128> bs(*i);
Здравствуйте, fspirit, Вы писали:
F>Здравствуйте, Dj.ValDen, Вы писали:
DV>>есть std::bitset<128> bst;
DV>>есть void *p; который указывает на 128 бит информации в памяти, которую требуется поместить в bst.
DV>>Именно это у меня и не получается
F>Насколько я знаю, у std::bitset<> есть конструктор bitset(unsighned long). Таким образом, я думаю, можно
F>сделать так
F>F>typedef unsigned long ulong;
F>ulong* i = static_cast<ulong*>(p);
F>bitset<128> bs(*i);
F>
Этот код не будет работать, так как ожидалось, потому что будут использованы только первые 32 бита (на 32-разрядных машинах).
Единственным решением, на мой взгляд, может служить конвертирование блока по частям в строку, выше указанным конструктором, а затем использование ее для инициализации объединенного битсета.
Реализация будет, наподобие этой:
#include <bitset>
#include <string>
#include <iostream>
const int BLOCK_BIT_SIZE=128;
std::bitset<BLOCK_BIT_SIZE> Block2Bitset(void* pBlock)
{
std::string strRep;
for(int i=0; i<BLOCK_BIT_SIZE/sizeof(long); i++) {
unsigned long l = *(unsigned long*)((char*)pBlock+i*sizeof(long));
strRep += std::bitset<sizeof(long)*8>(l).to_string
< char, std::char_traits<char>, std::allocator<char> >();
}
return std::bitset<BLOCK_BIT_SIZE>(strRep);
}
int _tmain(int argc, _TCHAR* argv[])
{
int x=127;
std::cout << Block2Bitset(&x).to_string< char, std::char_traits<char>, std::allocator<char> >() << std::endl;
return 0;
}
PS. Как избавится от параметризации метода to_string я не знаю и по-моему это вообще нельзя сделать.
F>>F>>typedef unsigned long ulong;
F>>ulong* i = static_cast<ulong*>(p);
F>>bitset<128> bs(*i);
F>>
_>Этот код не будет работать, так как ожидалось, потому что будут использованы только первые 32 бита (на 32-разрядных машинах).
Это точно
_>Единственным решением, на мой взгляд, может служить конвертирование блока по частям в строку, выше указанным конструктором, а затем использование ее для инициализации объединенного битсета.
_>Реализация будет, наподобие этой:
_>_>#include <bitset>
_>#include <string>
_>#include <iostream>
_>const int BLOCK_BIT_SIZE=128;
_>std::bitset<BLOCK_BIT_SIZE> Block2Bitset(void* pBlock)
_>{
_> std::string strRep;
_> for(int i=0; i<BLOCK_BIT_SIZE/sizeof(long); i++) {
_> unsigned long l = *(unsigned long*)((char*)pBlock+i*sizeof(long));
_> strRep += std::bitset<sizeof(long)*8>(l).to_string
_> < char, std::char_traits<char>, std::allocator<char> >();
_> }
_> return std::bitset<BLOCK_BIT_SIZE>(strRep);
_>}
_>int _tmain(int argc, _TCHAR* argv[])
_>{
_> int x=127;
_> std::cout << Block2Bitset(&x).to_string< char, std::char_traits<char>, std::allocator<char> >() << std::endl;
_> return 0;
_>}
_>
_>PS. Как избавится от параметризации метода to_string я не знаю и по-моему это вообще нельзя сделать.
Там (в конструкторе) нет аргументов шаблона по умолчанию.
Здравствуйте, fspirit, Вы писали:
З_>>>PS. Как избавится от параметризации метода to_string я не знаю и по-моему это вообще нельзя сделать.
F>>Там (в конструкторе) нет аргументов шаблона по умолчанию.
F>Тьфу, в методе этом — to_string.
перегрузить?