廢話不多說,上代碼
代碼
/************************************************************************
編程之美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
- 位域使用很是巧妙
- 注意運算符的優先級,如果不清楚,使用括號,此題深受其害!