加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:39:32 所属栏目:百科 来源:网络整理
导读:我正在研究棋盘的表示,我打算将它存储在32字节数组中,其中每个字节将用于存储两个部分. (这样每件只需要4位) 以这种方式执行此操作会导致访问板的特定索引的开销. 您是否认为,此代码可以优化或完全不同的访问索引方法可以使用? C char getPosition(unsigned
我正在研究棋盘的表示,我打算将它存储在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字节的棋盘表示.这次我尝试了一些不同的方法,只是为了看看我喜欢什么.记忆不是一个大问题.比特板肯定在我的名单上尝试.谢谢

解决方法

这是过早优化的问题.你的国际象棋棋盘需要64个字节来存储,现在需要32个.这真的让你感到沮丧吗?你是否真的分析了情况,看看你是否需要保存这些内存?

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读