C,使用一个字节来存储两个变量
我正在研究棋盘的表示,我打算将它存储在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周期,而不是内存.如果您的目标是手机或其他东西,这可能会有所不同,但即便如此,在您达到足够的深度以引起任何内存问题之前,您会更加担心速度. 至于我喜欢哪种表示…我喜欢位板.没有做过很多严肃的测量,但我确实比较了我制造的两个引擎,一个位板和一个阵列,而位板一个更快,可以达到比另一个更大的深度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |