废话不多说,上代码
代码
/************************************************************************
编程之美1.2中国象棋将帅的问题
************************************************************************/
#include <stdio.h>
/************************************************************************
方法一:使用位域 吊炸天
************************************************************************/
void first()
{
// 使用位域
struct
{
unsigned char a:4;
unsigned char b:4;
} i;
for (i.a = 1; i.a < 10; i.a++)
{
for (i.b = 1; i.b < 10; i.b++)
{
if (i.a % 3 != i.b %3)
{
printf("A=%d, B=%d\n", i.a, i.b);
}
}
}
}
/************************************************************************
方法二:使用位操作
* 读左边4位 b & 0x0f
* 加一后,存左边4位 b & 0xf0 | ((b&0x0f)+1))
* 读右边4位 (b & 0xf0) >> 4
* 加一后,存右边4位 b & 0x0f | (((b&0xf0>>4)+1)<<4)
************************************************************************/
void second()
{
unsigned char b = 1;
// 左四位
for (; (b&0x0f) < 10; b = b+1)
{
// 保证每次右四位都是一开始
b = b & 0x0f | 0x10;
// 右四位
for (; ((b&0xf0)>>4) < 10; b = (b & 0x0f | ((((b&0xf0)>>4)+1)<<4)))
{
if (((b&0x0f) % 3) != (((b&0xf0)>>4) % 3))
{
printf("%d, %d\n", b&0x0f, (b&0xf0)>>4);
}
}
}
}
int main(int argc, char *argv[])
{
//first();
second();
return 0;
}
PS
- 位域使用很是巧妙
- 注意运算符的优先级,如果不清楚,使用括号,此题深受其害!