
以这种方式执行此 *** 作会导致访问板的特定索引的开销.
您是否认为,此代码可以优化或完全不同的访问索引方法可以使用?
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周期,而不是内存.如果您的目标是手机或其他东西,这可能会有所不同,但即便如此,在您达到足够的深度以引起任何内存问题之前,您会更加担心速度.
至于我喜欢哪种表示…我喜欢位板.没有做过很多严肃的测量,但我确实比较了我制造的两个引擎,一个位板和一个阵列,而位板一个更快,可以达到比另一个更大的深度.
@H_404_2@ 总结以上是内存溢出为你收集整理的C,使用一个字节来存储两个变量全部内容,希望文章能够帮你解决C,使用一个字节来存储两个变量所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)