Ditandatangani atau Tidak ditandatangani panjang untuk papan permainan 8x8 di c

Saya memprogram permainan Reversi dalam C, dan saya baru mengenal bahasa tersebut (berasal dari Java), dan juga belum pernah memprogram permainan dengan papan 8x8 sebelumnya. Saya ingin menggunakan papan bit untuk mewakili papan permainan untuk pemain kulit putih dan hitam (masing-masing satu kata 64 bit), dan saya ingin tahu apakah saya harus menggunakan Unsigned long long untuk tujuan itu.

Dari apa yang saya tahu, Tipe Unsigned adalah tipe yang tidak menggunakan bit paling kiri sebagai indikator tanda (0 untuk positif dan 1 untuk negatif), saya juga tahu bahwa Java misalnya, hanya mendukung Tipe yang ditandatangani. tetapi dalam kasus saya, saya perlu menggunakan bagian paling kiri sebagai kotak yang valid untuk papan. Apakah penting jika saya menggunakan tipe yang ditandatangani atau tipe yang tidak ditandatangani untuk itu??

misalnya, jika saya meletakkan potongan putih di kotak terakhir bitBoard putih (bit paling kiri) dan angkanya menjadi negatif, bolehkah?


person user2030118    schedule 24.08.2013    source sumber


Jawaban (1)


Ya, jika Anda melakukan sesuatu dengan bit, sebaiknya gunakan unsigned.

Perhatikan bahwa unsigned long long dijamin setidaknya 64 bit, menurut standar C.

Lihatlah bit-field, sangat berguna dalam kasus Anda; menyelamatkan Anda dari mengutak-atik &, |, ^, ...

Tapi inilah idenya:

#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
Gunakan #include <stdint.h> dan ketik uint64_t untuk menjamin lebar 64 bit. - person DoxyLover; 24.08.2013
comment
Saya ingin tahu apa yang mereka lakukan di Java ketika ingin memprogram permainan papan 8x8 dan menggunakan tipe 64 bit? - person user2030118; 24.08.2013
comment
Perlu -- menurut saya tidak. Tanda tersebut tidak akan pernah berubah dengan sendirinya, dan selama bilangan tersebut tidak pernah diperlakukan sebagai sebuah angka (yaitu, melakukan penghitungan; mencetaknya) namun hanya sebagai sekumpulan bit, maka tidak seorang pun akan perhatikan itu benar-benar ditandatangani atau tidak, dan negatif atau positif. - person Jongware; 24.08.2013
comment
@ user2030118: Gunakan array? - person alk; 24.08.2013
comment
@jongware Itu juga terlintas di pikiran saya tetapi saya tidak yakin. mungkin ada hal yang aku tidak tahu. (Saya juga bukan ahli dalam manipulasi bit, hanya melakukan beberapa permainan sederhana sebelumnya) - person user2030118; 24.08.2013
comment
@ user2030118: Saya akan menggunakan bit hanya jika memori terbatas atau tidak ada bandwidth yang tersedia. - person alk; 24.08.2013
comment
array akan menjadi solusi paling sederhana, tetapi dengan bit Boards saya dapat melakukan trik yang rapi dengan kecepatan tinggi! akan menyelamatkan saya dari banyak iterasi panjang pada array. - person user2030118; 24.08.2013
comment
@ user2030118 Saya harap Anda menyukai papan bit. Saya sarankan menggunakan bidang bit. - person meaning-matters; 24.08.2013
comment
@ user2030118: kecepatan bergantung pada apa yang Anda lakukan dengan bit ini. Jika yang Anda lakukan hanyalah menguji dan mengubah bit individu, maka menurut saya array akan lebih cepat, karena memerlukan banyak pergeseran bit. Di sisi lain, saya menggunakan daftar bit sederhana seperti ini untuk pemecah Sudoku, dan kemudian Anda dapat menggunakan AND dan XOR untuk mendapatkan hasil yang berguna dengan cepat. Hal yang sama dengan array 0s dan 1s akan membutuhkan loop. - person Jongware; 24.08.2013
comment
unsigned long long adalah dijamin memiliki lebar setidaknya 64 bit, menurut standar - person Jens Gustedt; 24.08.2013