std::bitset<>
От: Dj.ValDen Украина http://ua.linkedin.com/in/dvalchuk
Дата: 22.08.04 15:29
Оценка:
есть std::bitset<128> bst;
есть void *p; который указывает на 128 бит информации в памяти, которую требуется поместить в bst.
Именно это у меня и не получается :(
С уважением Denys Valchuk

IMHO чем больше мнений тем оптимальней выбор варианта... :)
Re: std::bitset<>
От: fspirit Россия  
Дата: 22.08.04 17:07
Оценка:
Здравствуйте, 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);
Re[2]: std::bitset<>
От: misha_sk Россия  
Дата: 22.08.04 18:41
Оценка:
Здравствуйте, 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 я не знаю и по-моему это вообще нельзя сделать.
Re[3]: std::bitset<>
От: fspirit Россия  
Дата: 23.08.04 12:51
Оценка:
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 я не знаю и по-моему это вообще нельзя сделать.

Там (в конструкторе) нет аргументов шаблона по умолчанию.
Re[4]: std::bitset<>
От: fspirit Россия  
Дата: 23.08.04 16:37
Оценка:
З_>>PS. Как избавится от параметризации метода to_string я не знаю и по-моему это вообще нельзя сделать.
F>Там (в конструкторе) нет аргументов шаблона по умолчанию.
Тьфу, в методе этом — to_string.
Re[5]: std::bitset<>
От: Dj.ValDen Украина http://ua.linkedin.com/in/dvalchuk
Дата: 23.09.04 11:11
Оценка:
Здравствуйте, fspirit, Вы писали:

З_>>>PS. Как избавится от параметризации метода to_string я не знаю и по-моему это вообще нельзя сделать.

F>>Там (в конструкторе) нет аргументов шаблона по умолчанию.
F>Тьфу, в методе этом — to_string.

перегрузить?
С уважением Denys Valchuk

IMHO чем больше мнений тем оптимальней выбор варианта... :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.