как я печатаю неподписанный символ как шестнадцатеричное число в C++ с помощью ostream?

Альтернативное решение, использующее метод .query () :

In [5]: df.query("countries in @countries")
Out[5]:
  countries
1        UK
3     China

In [6]: df.query("countries not in @countries")
Out[6]:
  countries
0        US
2   Germany

68
задан Nathan Fellman 23 March 2009 в 12:51
поделиться

5 ответов

Я предложил бы использовать следующую технику:

struct HexCharStruct
{
  unsigned char c;
  HexCharStruct(unsigned char _c) : c(_c) { }
};

inline std::ostream& operator<<(std::ostream& o, const HexCharStruct& hs)
{
  return (o << std::hex << (int)hs.c);
}

inline HexCharStruct hex(unsigned char _c)
{
  return HexCharStruct(_c);
}

int main()
{
  char a = 131;
  std::cout << hex(a) << std::endl;
}

Это коротко для записи, имеет ту же эффективность как исходное решение, и это позволяет Вам принять решение использовать "исходный" вывод символов. И это безопасно с точки зрения типов (не использование "злых" макросов:-))

51
ответ дан Burkhard 7 November 2019 в 10:11
поделиться

Использование:

cout << "a is " << hex << (int) a <<"; b is " << hex << (int) b << endl;

И если Вы хотите дополнить начальными нулями тогда:

#include <iomanip>
...
cout << "a is " << setw(2) << setfill('0') << hex << (int) a ; 

, Поскольку мы используем броски C-стиля, почему бы не пойти до конца с терминальной вредностью C++ и использовать макрос!

#define HEX( x )
   setw(2) << setfill('0') << hex << (int)( x )

можно тогда сказать

cout << "a is " << HEX( a );

Редактирование: Однако решение MartinStettner намного более хорошо!

47
ответ дан 7 November 2019 в 10:11
поделиться

Я сделал бы это как MartinStettner, но добавил бы дополнительный параметр для количества цифр:

inline HexStruct hex(long n, int w=2)
{
  return HexStruct(n, w);
}
// Rest of implementation is left as an exercise for the reader

, Таким образом, Вы имеете две цифры по умолчанию, но можете установить четыре, восемь, или безотносительно если Вы хотите.

, например,

int main()
{
  short a = 3142;
  std:cout << hex(a,4) << std::endl;
}

Это может походить на излишество, но поскольку сказал Bjarne: "библиотеки должны быть просты в использовании, не легки записать".

4
ответ дан Jimmy J 7 November 2019 в 10:11
поделиться

Это будет также работать:

std::ostream& operator<< (std::ostream& o, unsigned char c)
{
    return o<<(int)c;
}

int main()
{
    unsigned char a = 06;
    unsigned char b = 0xff;
    std::cout << "a is " << std::hex << a <<"; b is " << std::hex << b << std::endl;
    return 0;
}
-1
ответ дан Nathan Fellman 7 November 2019 в 10:11
поделиться

При использовании предварительной заливки и символов со знаком бойтесь добавлять нежелательный 'F

char out_character = 0xBE; cout << setfill('0') << setw(2) << hex << unsigned short(out_character);

печать: ffbe

с помощью интервала вместо коротких результатов в ffffffbe

Для предотвращения нежелательного f's можно легко кашировать их.

char out_character = 0xBE; cout << setfill('0') << setw(2) << hex << unsigned short(out_character) & 0xFF;

0
ответ дан 24 November 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: