<<编程之美>>之中国象棋将帅问题

来源:互联网 发布:网络新兴职业 编辑:程序博客网 时间:2024/04/30 21:42
Problem Description
<<编程之美>>Chapter1 Section2 Page13
Problem Solutions
如果只是要求得到问题的解而不做其他限制,显然是很简单的问题.只需要遍历A的位置,再遍历B的位置然后判断即可.
问题是题目要求只能够使用一个字节的存储空间
char类型是一个字节
int类型是4个字节
short int类型是2个字节
那么只能够使用char类型了吗?
还有一种类型BYTE类型.
BYTE类型是1个字节,并且也可以用来表示整数.

只用一个整数怎么实现一个嵌套的循环呢?
<<编程之美>>书中给出了3个解法.
下面是3种解法中个人认为最优雅的解法.
BYTE i = 81;
while(i--)
{
    if(i / 9 % 3 == i % 9 % 3)
        continue;
    printf("A=%d,B=%d\n"i / 9 + 1, i % 9 + 1);
}
More
用i/9来表示A的位置,用i%9来表示B的位置,确实是不错的想法,避开了相对麻烦的bit级别的操作.
尽管上面的解法避开了bit级别的操作,但是了解和掌握bit级别的操作还是很有必要的.
对一个8个bit位的数字
如果要清空右边的4个比特,只需要把它和11110000(即240)做与运算
如果要清空左边的4个比特,只需要把它和00001111(即15)做与运算
如果要对右边的4个比特重新赋值为xxxx,只需要先清空右边的4个比特,然后把这个数字和0000xxxx做或运算
如果要对左边的4个比特重新赋值为xxxx,只需要先清空左边的4个比特,然后把这个数字和xxxx0000做或运算
如果要得到左边的4个比特,只需要先清空右边的4个比特,然后将结果右移4位
如果要得到右边的4个比特,只需要清空左边的4个比特
0 0
原创粉丝点击