中国象棋将帅问题 之 一个字节存储

一、问题引出

切入正题,如果现在需要写一段3重嵌套循环,我们会习以为常的用i、j和k三个变量,写出如下格式代码

for(int i=0; i<10; i++){
	for(int j=0; j<5; j++){
		for(int k=0; k<8; k++){
			
		}
	}
}

但是如果要求只用一个循环就实现以上3重循环,有一个明显的优点就是可以节省内存,本来三个变量现在只需一个变量。这该怎么实现呢?


二、抛砖引玉

现在先看看一下例子,帮助理解。

现在有一12位二进制数 A = 1011 0111 0110,如何取得其第0-3位呢(0110)?
这无非就是模与除的操作。
0-3位的值 = A % 24 = 0110
4-11位的值 = A / 24 = 1011 0111
4-6位的值 = A / 24 % 23 = 1011 0111 % 23 = 111
如果上面这个例子能够理解,那么这篇笔记的重点便被你掌握了。


三、直捣黄龙

for(int i=0; i<10; i++){
	for(int j=0; j<5; j++){
		for(int k=0; k<8; k++){
			
		}
	}
}

这个3重循环中,总共需要循环 10 x 5 x 8 = 400 次循环,那我我们可以用A = 400 来表示这个循环,

while(A--){

}

此时,A可以看成由i j k组成的类似于二进制数机制,在每次循环中,i、j和k所代表的值,如下:
k = A % (k所表示的范围) = A % 8
j = A / (k所表示的范围) % (j所表示的范围) = A / 8 % 5
i = A / (j、k所表示的范围) % (i所表示的范围) = A / (5 x 8 ) % 10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值