在《编程之美》中看到的题目,特此记录。
题目描述
如果象棋中只有将和帅,并且它们只能在田字格中走。那么不发生冲突的位置列举出来。
要求是只能使用一个byte进行存储。
题目分析
将帅各有9个位置,那么存储只要18种状态。那么使用前4 bits表示将,后4 bits表示帅。那么我们就可以得到相应的位置存储。
下面定义对左右两边位置的存取。
定义原来的数字是 a。
如需要把右边置为 n, 那么使用 (11110000 & a) | n
如需要把左边置为 n, 那么使用 (00001111 & a) | (n << 4)
如果需要取右边的数字: 00001111 & a
如果需要取左边的数字: 11110000 & a
代码实现
#include <stdio.h>
#define HALF_BITS_LENGTH 4
#define FULLMASK 255
#define RMAKS (FULLMASK >> 4)