Signed или Unsigned long для игрового поля 8x8 в c

Я программирую игру Reversi на C, и я новичок в этом языке (исходя из java), а также никогда раньше не программировал игру с доской 8x8. Я хочу использовать битовые доски для представления игрового поля как для белых, так и для черных игроков (по одному 64-битному слову для каждого), и мне интересно, следует ли мне использовать для этой цели Unsigned long long.

Из того, что я знаю, тип без знака - это тип, который не использует бит leftMost в качестве индикатора знака (0 для положительного и 1 для отрицательного), я также знаю, что java, например, поддерживает только подписанные типы. но в моем случае мне нужно было бы использовать самый левый бит в качестве действительного квадрата для доски. Имеет ли значение, использую ли я для этого подписанный или неподписанный тип?

например, если я поставлю белую фигуру на последний квадрат белой доски (самый левый бит), и число станет отрицательным, это нормально?


person user2030118    schedule 24.08.2013    source источник


Ответы (1)


Да, если вы делаете что-то с битами, вам лучше использовать unsigned.

Обратите внимание, что unsigned long long гарантированно будет не менее 64 бит по стандарту C.

Взгляните на битовые поля, очень удобные в вашем случае; избавляет вас от возни с &, |, ^, ...

Но вот идея:

#include <stdint.h>  // Thanks @DoxyLover
typedef struct
{
    uint8_t a : 1;
    uint8_t b : 1;
    uint8_t c : 1;
    uint8_t d : 1;
    uint8_t e : 1;
    uint8_t f : 1;
    uint8_t g : 1;
    uint8_t h : 1;
} BoardRow;

typedef struct
{
    BoardRow r1;
    BoardRow r2;
    BoardRow r3;
    BoardRow r4;
    BoardRow r5;
    BoardRow r6;
    BoardRow r7;
    BoardRow r8;
} Board;

void someFunction(void)
{
    Board board;

    board.r5.d = 1;
    ...

    // You can save these board in uint64_t if you like.
    uint64_t savedBoard = (uint64_t)board;
    ...
}
person meaning-matters    schedule 24.08.2013
comment
Используйте #include <stdint.h> и введите uint64_t, чтобы гарантировать разрядность 64 бита. - person DoxyLover; 24.08.2013
comment
Интересно, что они делают на Java, когда хотят запрограммировать настольную игру 8x8 и использовать 64-битные типы? - person user2030118; 24.08.2013
comment
Нужно -- я так не думаю. Знак никогда не изменится сам по себе, и до тех пор, пока число не будет рассматриваться как число (т. обратите внимание, что это действительно знак или без знака, и отрицательный или положительный. - person Jongware; 24.08.2013
comment
@ user2030118: Использовать массивы? - person alk; 24.08.2013
comment
@jongware Это тоже пришло мне в голову, но я просто не уверен. может есть вещи, которых я не знаю. (Я также не эксперт в битовых манипуляциях, раньше играл только в пару простых игр) - person user2030118; 24.08.2013
comment
@user2030118: user2030118: Я бы использовал биты только в том случае, если памяти мало или пропускная способность недоступна. - person alk; 24.08.2013
comment
Массив был бы самым простым решением, но с битовыми досками я могу делать изящные трюки с большой скоростью! сэкономит мне много длинных итераций по массиву. - person user2030118; 24.08.2013
comment
@user2030118 user2030118 Надеюсь, вам нравится битовая доска, которую я предлагаю использовать с битовыми полями. - person meaning-matters; 24.08.2013
comment
@ user2030118: скорость зависит от того, что вы делаете с этими битами. Если все, что вы делаете, это тестируете и изменяете отдельные биты, то я полагаю, что массив быстрее, так как он требует много битового сдвига. С другой стороны, я использовал простой битовый список, подобный этому, для решения судоку, а затем вы можете использовать операторы AND и XOR для быстрого получения полезных результатов. То же самое с массивом из 0 и 1 потребует циклов. - person Jongware; 24.08.2013
comment
unsigned long long гарантированно имеет ширину не менее 64 бит по стандарту - person Jens Gustedt; 24.08.2013