Я пытаюсь представить 52 карты в колоде игральных карт. Мне нужно всего 6 бит; 2 за масть и 4 за звание. Я думал, что буду использовать char и первые 2 бита будут равны нулю, так как они мне не нужны. Проблема в том, что я не знаю, есть ли способ инициализировать char с помощью битов.

Например, я бы хотел сделать следующее:

Char aceOfSpades = 00000000;

Char queenOfHearts = 00011101;

Я знаю, что после инициализации char я могу манипулировать битами, но было бы проще, если бы я мог инициализировать его с самого начала, как показано в моем примере. Заранее спасибо!

c++
2
Vindictive 21 Фев 2016 в 00:45

2 ответа

Лучший ответ

Да, ты можешь:

Пример,

  char aceOfSpades = 0b00000000;
  char queenOfHearts = 0b00011101;
6
bhzag 20 Фев 2016 в 21:49

Более простой способ, как сказал в комментариях капитан Обливиус, - использовать битовое поле

struct SixBits
{
     unsigned int suit : 2;
     unsigned int rank : 4;
};

int main()
{
     struct SixBits card;
     card.suit = 0;        /*  You need to specify what the values mean */
     card.rank = 10;
}

Вы можете попробовать использовать различные операции с битами на char, но с этим труднее работать. Также существует потенциальная проблема, заключающаяся в том, что зависит от реализации, является ли char signed или unsigned - и, если это signed, операции bitfiddling в некоторых случаях дают неопределенное поведение (например, при работе с отрицательным значением).

Лично я бы не стал пытаться упаковать все в char. Я бы сделал код понятным (например, использовал бы enum для представления sut, int для представления ранга), если нет очевидной необходимости (например, попытка заставить программу работать на машине с чрезвычайно ограниченной памятью, что маловероятно на практике с оборудованием менее 20 лет). В противном случае все, что вы действительно достигнете, - это код, который трудно поддерживать с некоторыми реальными преимуществами.

4
Peter 20 Фев 2016 в 22:13