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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值