Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Перевод unsigned __int64 в биты с++

#c #cpp


Есть число unsigned __int64 есть ли способ в с/с++ получить из него строку битов?     


Ответы

Ответ 1



например вот так: unsigned __int64 num = 100; char buf[64]; _itoa_s(num, buf, 2); cout << buf; или даже так (слегка по-извращенски): unsigned __int64 num = 100; std::string st = ""; while (num) { st.insert(0, num & 1 ? "1" : "0"); num >>= 1; } cout << st.c_str() << endl;

Ответ 2



C++: bitset C: itoa()

Ответ 3



Если у Вас на самом деле простая прагматичная задача установки, проверки и сброса бита по его номеру и 64 бит Вам достаточно, то можно использовать простые макросы. Вот пример #include #include #include #define SETBIT(u,n) ((u) |= ((int64_t)1<<(n))) #define CLRBIT(u,n) ((u) &= ~((int64_t)1<<(n))) #define TSTBIT(u,n) ((u) & ((int64_t)1<<(n))) int main () { uint64_t x = 0; SETBIT(x,0); SETBIT(x,1); SETBIT(x,62); SETBIT(x,63); printf ("%llx\n",(long long)x); CLRBIT(x,1); CLRBIT(x,62); printf ("%llx\n",(long long)x); if (!TSTBIT(x,62)) printf("bit 62 is cleared\n"); if (TSTBIT(x,0)) printf("bit 0 is set\n"); SETBIT(x,30 + 2); printf ("%llx\n",(long long)x); return puts("End") == EOF; } Работает и в C и в C++. avp@avp-ubu1:~/hashcode$ g++ bits.c avp@avp-ubu1:~/hashcode$ ./a.out c000000000000003 8000000000000001 bit 62 is cleared bit 0 is set 8000000100000001 End avp@avp-ubu1:~/hashcode Естественно, подобным же образом (взяв или сконструировав правильную маску) можно устанавливать, сбрасывать или проверять группу бит за одну операцию.

Ответ 4



Почему ещё никто не опубликовал решение в compile-time с template metaprogramming? template struct to_binary_string_rec { typedef typename to_binary_string_rec< n / 2, typename boost::mpl::push_front< s, boost::mpl::char_<(n & 1) ? '1' : '0'> >::type >::type type }; template struct to_binary_string_rec<0, s> { typedef typename boost::mpl::if_< typename boost::mpl::empty::type, boost::mpl::string<'0'>, s >::type type; }; template struct to_binary_string { typedef typename to_binary_string_rec< n, boost::mpl::string<> >::type type; }; #define TO_BINARY_STRING(n) boost::mpl::c_str< to_binary_string::type >::value (Сорри, не тестировал, т.к. нет boost'а под рукой.)

Ответ 5



Нет %b аналога %x, %o printf-спецификаторов, нет std::bin аналога std::hex, std::oct iomanip для двоичной системы и нет функции _itoa_s() в стандартном C/C++. Можно использовать bitset<>, чтобы unsigned целое число в "01"-строку с битами превратить: #include #include #include int main() { uint64_t n = 123; std::bitset::digits> bits{n}; std::cout << bits.to_string(); } Пример: $ c++ -std=c++11 *.cc && ./a.out 0000000000000000000000000000000000000000000000000000000001111011

Комментариев нет:

Отправить комментарий