ลงชื่อหรือไม่ได้ลงนามแบบยาวสำหรับบอร์ดเกม 8x8 ในค

ฉันกำลังเขียนโปรแกรมเกม Reversi ด้วยภาษา C และฉันยังใหม่กับภาษานี้ (มาจาก java) และยังไม่เคยเขียนโปรแกรมเกมด้วยบอร์ด 8x8 มาก่อน ฉันต้องการใช้ bit Boards เพื่อแสดงบอร์ดเกมสำหรับผู้เล่นทั้งคนขาวและดำ (คำละ 64 บิตหนึ่งคำ) และฉันสงสัยว่าฉันควรใช้ Unsigned long เพื่อจุดประสงค์นั้นหรือไม่

จากสิ่งที่ฉันรู้ Unsigned Type เป็นประเภทที่ไม่ใช้ leftMost bit เป็นตัวบ่งชี้เครื่องหมาย (0 สำหรับค่าบวกและ 1 สำหรับค่าลบ) ฉันรู้ด้วยว่า Java นั้นรองรับเฉพาะประเภทที่เซ็นชื่อเท่านั้น แต่ในกรณีของฉัน ฉันจะต้องใช้บิตซ้ายสุดเป็นกำลังสองที่ถูกต้องสำหรับกระดาน ไม่สำคัญว่าฉันจะต้องใช้ประเภทที่ลงนามหรือไม่ได้ลงนามเพื่อสิ่งนั้นหรือไม่?

ตัวอย่างเช่น ถ้าฉันวางชิ้นสีขาวบนสี่เหลี่ยมสุดท้ายของบิตบอร์ดสีขาว (บิตซ้ายสุด) แล้วตัวเลขจะกลายเป็นลบ ตกลงไหม?


person user2030118    schedule 24.08.2013    source แหล่งที่มา


คำตอบ (1)


ใช่ หากคุณกำลังทำสิ่งต่าง ๆ ด้วยบิต คุณควรใช้ unsigned ดีกว่า

โปรดทราบว่า unsigned long long รับประกันว่าจะมีอย่างน้อย 64 บิตตามมาตรฐาน C

ดู bit-fields ซึ่งมีประโยชน์มากในกรณีของคุณ ช่วยให้คุณไม่ต้องเล่นซอเล็กน้อยด้วย &, |, ^, ...

แต่นี่เป็นแนวคิด:

#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: ฉันจะใช้บิตก็ต่อเมื่อหน่วยความจำแน่นหรือไม่มีแบนด์วิดท์ - person alk; 24.08.2013
comment
array จะเป็นวิธีแก้ปัญหาที่ง่ายที่สุด แต่ด้วย bit Boards ฉันสามารถเล่นกลได้อย่างประณีตด้วยความเร็วที่ยอดเยี่ยม! จะช่วยฉันประหยัดเวลาได้มากในการทำซ้ำอาร์เรย์ - person user2030118; 24.08.2013
comment
@ user2030118 ฉันหวังว่าคุณจะชอบบิตบอร์ด ฉันขอแนะนำให้ใช้ฟิลด์บิต - person meaning-matters; 24.08.2013
comment
@ user2030118: ความเร็วขึ้นอยู่กับสิ่งที่คุณทำกับบิตเหล่านี้ หากคุณเพียงแค่ทดสอบและเปลี่ยนแปลงบิต แต่ละ ฉันคิดว่าอาร์เรย์จะเร็วกว่า เนื่องจากต้องมีการขยับบิตจำนวนมาก ในทางกลับกัน ฉันใช้รายการบิตง่ายๆ เช่นนี้สำหรับตัวแก้ปัญหา Sudoku จากนั้นคุณสามารถใช้ AND และ XOR เพื่อรับผลลัพธ์ที่เป็นประโยชน์ได้อย่างรวดเร็ว เช่นเดียวกับอาร์เรย์ 0 และ 1 จะต้องมีการวนซ้ำ - person Jongware; 24.08.2013
comment
unsigned long long คือรับประกันว่าจะมีความกว้างอย่างน้อย 64 บิตตามมาตรฐาน - person Jens Gustedt; 24.08.2013