题目要求:中国象棋将帅问题
书中给出了三种解法
解法一:主要就是讲解按位运算的技巧。例如 1 byte字符,
- 如果需要保留低四位,重设高四位的值,则按位‘与’00001111,再将结果按位‘或’新设置的值n(这里的n需要左移位n<<4)。反之,如果需要保留高四位的值,重设低四位的值,则按位 ‘与’11110000,再将结果按位‘或’需要设置的值
- 总结就是【'与'上‘1’->取值,‘或’上n设值】。
解法二:这个解法的关键就是将这两个棋盘一共有 9*9=81种可能,则当A的棋子在(0001)位置时,B的棋子可以在对应棋盘的其他任意位置。
这里需要注意的技巧性是 81/9 取十位数字,81%9取个位数字。同时,题目要求两方的棋子不可以在同一列位置上,则在棋盘范围里,将他们的数值对3取余数是不一样的,那么这样的棋子摆放就是成立的。(在需要进行进制转换的时候这个是很常用的方法!)
所以有
if(i / 9 % 3 == i % 9 % 3) //判断位置是否合法
continue;
printf..........
解法三:一个很特别的结构体
struct
{
unsigned char a:4;
unsigned char b:4;
}i;
32位系统中charl类型占用一个字节(1 Byte),这里在结构体中设置位域,a,b各占四位,满足题目条件只用一个字节完成变量存储。
只能在结构体里使用,建议尽量少用,会破坏程序的移植性。
当结构体中的元素的取值范围很小时,可以将几个字段按位合成一个字段来表示,起到节省内存空间的作用。
tips:32位系统中,char (1 Byte)
int (4 Byte)
建议声明结构体时,按照不同变量的类型,按占用空间的大小升序或降序声明会取得较好的空间占用。