首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

俄羅斯方塊形狀用 16 位十六進制數表示:位運算存儲原理

     編輯:程式設計疑難解答

為什麼用 16 位整數?

每個方塊佔據 4×4 格子,共 16 個位置,**每個位置只有「有方塊」或「無方塊」兩種狀態**,完美對應 16 位元的 0/1。

對應關係

4x4 矩陣          位元位置 (bit 15 ~ bit 0)
[0,0] [0,1] [0,2] [0,3]   →  bit15 bit14 bit13 bit12
[1,0] [1,1] [1,2] [1,3]   →  bit11 bit10 bit9  bit8
[2,0] [2,1] [2,2] [2,3]   →  bit7  bit6  bit5  bit4
[3,0] [3,1] [3,2] [3,3]   →  bit3  bit2  bit1  bit0

經典形狀十六進制值

形狀矩陣二進制十六進制
I第 0 行全滿1111 0000 0000 00000xF000
O左上 2x21100 1100 0000 00000xCC00
T第 0 行中間三格 + 第 1 行中間0111 0100 0000 00000x7400
L第 0 行第一格 + 第 1 行全滿1000 1111 0000 00000x8F00

位運算常用操作


// 判斷某格是否有方塊
bool hasBlock(int shape, int row, int col) {
    int bit = 15 - (row * 4 + col);
    return (shape & (1 << bit)) != 0;
}

// 旋轉 90 度(矩陣轉置 + 翻轉)
int rotate90(int shape) {
    int rotated = 0;
    for (int r = 0; r < 4; r++)
        for (int c = 0; c < 4; c++)
            if (hasBlock(shape, r, c))
                rotated |= 1 << (15 - (c * 4 + (3 - r)));
    return rotated;
}

// 碰撞檢測:(shape & boardRowBits) != 0

優勢

  • **極度緊湊**:一個 uint16_t 存一個形狀狀態。
  • **極快運算**:位運算單指令完成旋轉、平移、碰撞檢測。
  • **易於序列化**:存檔、網路傳輸直接寫入 2 位元組。

這是遊戲開發中**位元組壓縮**與**位運算加速**的經典教科書級應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved