我正在处理象棋棋盘的表示,计划将其存储在32字节的数组中,每个字节用于存储两个棋子(这样每个棋子只需要4位)。
使用这种方式会导致访问特定索引的棋盘的开销增加。您认为是否可以优化此代码或完全使用不同的索引访问方法?
c++
char getPosition(unsigned char* c, int index){
//moving pointer
c+=(index>>1);
//odd number
if (index & 1){
//taking right part
return *c & 0xF;
}else
{
//taking left part
return *c>>4;
}
}
void setValue(unsigned char* board, char value, int index){
//moving pointer
board+=(index>>1);
//odd number
if (index & 1){
//replace right part
//save left value only 4 bits
*board = (*board & 0xF0) + value;
}else
{
//replacing left part
*board = (*board & 0xF) + (value<<4);
}
}
int main() {
char* c = (char*)malloc(32);
for (int i = 0; i < 64 ; i++){
setValue((unsigned char*)c, i % 8,i);
}
for (int i = 0; i < 64 ; i++){
cout<<(int)getPosition((unsigned char*)c, i)<<" ";
if (((i+1) % 8 == 0) && (i > 0)){
cout<<endl;
}
}
return 0;
}
我同样对您在国际象棋表示法方面的意见以及上述方法的优化作为一个独立问题非常感兴趣。
非常感谢。
编辑
感谢您的回复。一段时间前,我创建了跳棋游戏,使用了64字节的棋盘表示法。这次我正在尝试一些不同的方法,只是想看看我喜欢什么。内存并不是很大的问题。位棋盘绝对在我的尝试列表中。谢谢。