C++,使用一个字节来存储两个变量

kir*_*rbo 3 c++ performance pointers chess

我正在研究棋盘的表示,我打算将它存储在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;
}
Run Code Online (Sandbox Code Playgroud)

我对你对国际象棋表征的看法以及上述方法的优化同样感兴趣,作为一个独立的问题.

非常感谢

编辑

谢谢你的回复.前段时间我创建了跳棋游戏,我使用的是64字节的棋盘表示.这次我尝试了一些不同的方法,只是为了看看我喜欢什么.记忆不是一个大问题.比特板肯定在我的名单上尝试.谢谢

Edw*_*nge 9

这是过早优化的问题.你的国际象棋棋盘需要64个字节来存储,现在需要32个.这真的有什么结果呢?你是否真的分析了情况,看看你是否需要保存这些内存?

假设你用最少的最佳搜索方法之一,直线AB搜索深度d没有启发式,你生成搜索之前所有有可能的行动,为您的主板所需的那么绝对最大内存将是的sizeof(板)*W*D.如果我们假设一个相当大的W = 100且大D = 30那么你将在深度为D的内存中有3000块板.64k对32k ......真的值得吗?

另一方面,您增加了访问电路板[位置]所需的操作量,每次搜索会调用数百万次.

建立国际象棋时,你最终要找的主要是cpu周期,而不是内存.如果您的目标是手机或其他东西,这可能会有所不同,但即便如此,在您达到足够的深度以引起任何内存问题之前,您会更加担心速度.

至于我喜欢哪种表示...我喜欢位板.没有做过很多严肃的测量,但我确实比较了我制造的两个引擎,一个位板和一个阵列,而位板一个更快,可以达到比另一个更大的深度.